Golang知识点(一)

知识点梳理

  • 函数外的每个语句都必须以关键字开始(var、const、func等)

  • 整型和浮点型变量的默认值为0。 字符串变量的默认值为空字符串。 布尔型变量默认为false。 切片、函数、指针变量的默认为nil

  • 数据类型:除了基本的整型、浮点型、布尔型、字符串外,还有数组、切片、结构体、函数、map、通道(channel)等

  • 字符串使用双引号(")

  • 多行字符串时,就必须使用反引号,反引号间换行将被作为字符串中的换行,但是所有的转义字符均无效,文本将会原样输出

    s1 := `第一行
    第二行
    第三行
    `
    fmt.Println(s1)
    
  • 组成每个字符串的元素叫做“字符”,可以通过遍历或者单个获取字符串元素获得字符。 字符用单引号(’)包裹起来,如:
    var a = '中'
    var b = 'x'
    
  • 字符串底层是一个byte数组,所以可以和[]byte类型相互转换

  • rune类型用来表示utf8字符,一个rune字符由一个或多个byte组成。

  • 要修改字符串,需要先将其转换成[]rune[]byte,完成后再转换为string。无论哪种转换,都会重新分配内存,并复制字节数组。

    func changeString() {
    s1 := "big"
    // 强制类型转换
    byteS1 := []byte(s1)
    byteS1[0] = 'p'
    fmt.Println(string(byteS1))
    
    s2 := "白萝卜"
    runeS2 := []rune(s2)
    runeS2[0] = '红'
    fmt.Println(string(runeS2))
    }
    
  • Go语言中只有强制类型转换,没有隐式类型转换。

  • 取地址操作符&和取值操作符*是一对互补操作符,&取出地址,*根据地址取出地址指向的值。

  • 在Go语言中对于引用类型的变量,我们在使用的时候不仅要声明它,还要为它分配内存空间,否则我们的值就没办法存储。

  • 值类型的声明不需要分配内存空间,是因为它们在声明的时候已经默认分配好了内存空间。

  • new函数不太常用,使用new函数得到的是一个类型的指针,并且该指针对应的值为该类型的零值。

  • 指针作为引用类型需要初始化后才会拥有内存空间,才可以给它赋值。

    func main() {
    var a *int
    a = new(int)
    *a = 10
    fmt.Println(*a)
    }
    
  • make也是用于内存分配的,区别于new,它只用于slice、map以及chan的内存创建,而且它返回的类型就是这三个类型本身,而不是他们的指针类型,因为这三种类型就是引用类型,所以就没有必要返回他们的指针了。(var b map[string]int只是声明变量b是一个map类型的变量,需要像下面的示例代码一样使用make函数进行初始化操作之后,才能对其进行键值对赋值)
    func main() {
    var b map[string]int
    b = make(map[string]int, 10)
    b["沙河娜扎"] = 100
    fmt.Println(b)
    }
    
  • 可变参数是指函数的参数数量不固定。Go语言中的可变参数通过在参数名后加...来标识。
    func intSum3(x int, y ...int) int {
    fmt.Println(x, y) //y是一个切片
    sum := x
    for _, v := range y {
        sum = sum + v
    }
    return sum
    }
    
  • defer定义的逆序进行执行,也就是说,先被defer的语句最后被执行,最后被defer的语句,最先被执行。
    func main() {
    fmt.Println("start")
    defer fmt.Println(1)
    defer fmt.Println(2)
    defer fmt.Println(3)
    fmt.Println("end")
    }