zoukankan      html  css  js  c++  java
  • go最基础语言特征

    12,函数指针,指针函数

    函数指针:一个指针。指向函数的指针。函数默认就是指针类型。还有slice,map, function

    指针函数:一个函数。函数的返回值是指针。

    把指针用做参数。调用之后会修改原值。与值传递不同。

    用途:指针用于值传递类型。slice,map等本身就是指针,就无需再使用。

    11,指针,指针数组,数组指针

    Var a = 10
    var p1 * int
    p1 = &a;
    &p1 取地址
    *p1 取内容
     
     
    指针的指针
    var p2 ** int
    p2 = &p1;
     
     p2的值是p1的地址
    *p2 是 p1的值,a的地址
    **p2 是 a的值10
     
     
    数组指针:指向数组的指针。*[4]Type
    指针数组:数组里每一个元素都是指针。[4] * Type. arr3 = [4] *int { &a, &b, &c, &d }
     
    * 在前面是指针,执行一个数组的地址
    []在前面是数组,里面元素是指针
     
    **[],指针,指向的内容又是一个指针。

    10,函数

    defer:延迟到最后执行。主函数所有执行完毕再执行。

    例如:文件打开。defer close(); 对象关闭,临时文件删除。

    多个defer函数调用,是栈结构。先进后出。

    如果发生传递参数,则以传进去时为准,后面变化跟传进去时没有关系了。

    defer函数调用后,才是panic或才是return。

    传参

    值传递:基本数据类型,array,struct。复制一份副本。注意

    引用传递:slice,map,channel。参数指向同一块内容。

    可变参数:是切片。func getSum(nums ... int) {} 调用:getSum(1,2,3)

    s1 := []int{1, 2, 3}; getSum(s1...)

    返回值:getSum() (sum int) {}

    多返回值

    函数的本质
    fun fun1 (int, int) {
    }
    函数的定义跟变量一样,也是开辟一块内存空间
    %T是函数定义。
    fun1是地址。看做函数名对应的函数体的地址。
    var c func(int, int) // c是nil
    c = fun1 // 将函数体的地址赋给c
     
    回调函数
    func add(a, b int) int { return a + b }
    func oper(a, b int, fun func(int, int) int) int {
    fun地址
    return fun(a, b)
    }
    简单点说,跟js的函数一样,唯一的差别是需要声明参数和返回值的类型。
    匿名函数,回调函数,闭包都一样。
     

    9,array,slice和map

    map,跟js的对象很像。但这一组key和value的值是相同的。不能混搭。

    var map1 map[int]string //没有初始化,是nil,无法直接使用     map1 == nil //true

    var map2 = make(map[int]string) // 盘子里没饺子   map1 == nil // false

    var map3 = map[key类型]value类型{key: valule} // 盘子里有饺子   map1 == nil // false

    value, ok := map[key]

    ok 可以判断key是否存在。

    if ok { //对应的值

    } else { //不存在key }

    len(map) // key的个数

    delete key存在删除,key不存在则不影响

    循环:用for range,如果想排序,可以借助slice。sort.Ints(keys),  sort.Strings(s1),按字符串编码排序

    array和slice的区别
    数组的长度固定,数组是值类型(值类型有基本数据类型,结构体类型),slice的值长度可变,属于引用类型(引用类型:字典类型,通道类型,函数类型)切片是引用传递,所以它们不需要使用额外的内存并且比使用数组更有效率。

    如果传递的是引用类型,那么就是“传引用”,如果传递的是值类型,那么就是“传值”(会把以前的数据复制一遍)

    数组长度在声明的时候就必须给定,并且之后不会再改变。

    slice类型的字面量中只有元素类型,没有长度。切片长度可以自动随着元素数量的增长而增长,但不会随着元素数量的减少而减少。

    数组的容量=长度,不可改变。

    slice底层是数组,扩容是指向新数组了。扩容的时候容量每次翻倍。扩容是在容量不够的时候才扩,并不是每次都扩。

    make(类型,长度,容量) // 类型如[]int,10,100

    slice:变长数组。痛点是长度固定。 

    在已有数组上创建切片,在没有扩容前执行原数组。

    深拷贝与前拷贝:其中copy非常灵活。

    数组:相同数据类型的一组数。值复制。相同数据类型 arr1 == arr2,比较的里面的值和长度,而不是地址。

    js中的数组,本质是slice,而不是go中的数组。

    8,语句

    if statemennt; condition {}。例如:if num:=10; num%2==0 {} // num只能在if里面使用

    switch 省略后面的变量相当于true,也可以有表达式,用法跟if相同。

     

    fullthrough,穿透case:

    for

     变现写法。但变量作用域变了。

    for {} 省略了表达式2,永真,相当于while(true)

    goto loop

    没有while,do while

    7,输入输出

    输出:print

    print, printf, println

    %v, %T, %t, %s, %c字符,%f, %d,  %p 地址

    %b 二进制

    %o 八进制

    %x 0-9, a-f

    %X 0-9, A-F

    输入:scan,阻塞式

    scanln, scanf

    bufio包:文件读写。

    6,运算符

    div := a / b  //取商

    mod := a % b //取余,也叫取模

    ++,--做了精简,只能作为表达式,不参与运算。

    5,基本数据类型转换

    int()

    4,字符串

    单引号,与双引号区别是:'A'是65(ascii码),双引号才是A

    中国的gbk,兼容了ASCII码

    Unicode统一编码,规范

    utf-8,utf-16,utf-32 存储

    d 单引号时,编码值

    c, q

    ``和""都可以包字符串,而且可以互相包

    字符串与byte的关系,太奇妙了,本质是字符串都是编码。

    3,数据类型

    基本数据类型:布尔型、数字(整数,浮点数,复数,byte)、字符串 

    复合数据类型:array,slice,function,pointer,struct,interface,channel等

    int, uint跟平台有关。

    byte是uint8的别称

    rune是int32的别称

    go语言的+只能连接

    2,常量

    一组常量,如果某个常量美原油初始化,默认和上一行一致。

    const (

    a int = 100

    b

    c string = "hello"

    d

    )

    // b也是100

    // c

    可以枚举

    iota,特殊常量,可以被编译器修改的常量,被用作枚举值

    const (

    a = iota // 0 第一次定义,是0

    b = iota // 1  又定义一个常量,是1

    c = iota // 2

    )

    const (

    d = iota // 0 再次从零计算。跟const配对

    e // 1

    )

    const (

    MALE = iota // 0

    FEMALE // 1

    UNKNOWN  // 2

    )

    1,变量

    go是静态语言,变量的类型和赋值必须一致。

    简短定义方式,左边的变量名至少有一个是新的

    简短定义方式,不能定义全局变量

    变量的零值,也叫默认值。数字0,字符串""

    变量定义了就要使用,否则无法通过编译。

  • 相关阅读:
    文件或目录损坏且无法读取的解决办法
    MP3/视频播放
    系统备份
    网线水晶头接法
    网站模板
    EasyNVR将如何能够把内网各种各样的监控摄像机对接到公网云平台
    EasyNVR将如何能够把内网各种各样的监控摄像机对接到公网云平台
    EasyPusher手机直播推送是如何实现后台直播推送的
    EasyPusher手机直播推送是如何实现后台直播推送的
    EasyDarwin开源流媒体服务器支持basic基本认证和digest摘要认证解析
  • 原文地址:https://www.cnblogs.com/zccst/p/14018275.html
Copyright © 2011-2022 走看看