go学习笔记

1.在go语言中,变量没有初始化,则根据当前类型默认为对应的“零”;

  例如:int -> 0, bool -> false, string-> "",其他派生类型为 nil 

  

 2.println和fmt.Println的区别:

  println有built-in包提供,主要用来打印错误,且没有返回值,主要用来debug

  fmt.Println是标准库提供的标准输出,第一个数为输出使用了多少字节,第二个为错误信息上

  

  

 

  。。。谁能想到输出你好怎么搞出7个字节的

3.unsafe.Sizeof(tmp),返回tmp的占用的内存大小,

  注意点:string类型总是返回16,原因是因为string对应的是一个结构体,包含两个字段,一个是指向值的指针,一个是长度,所以两个字段一共占用了16字节。

4.结构体的指针

  在学习int指针的时候了解到应该用*号从地址中取值,但是到结构体指针时看到不用*号也能直接获取值,这一点有点费解。

  

 

   从图中可以看到,对于结构体指针来说,加不加*号都是一样的效果。

  原因:借用go语言中文网一位大佬的翻译:

  

  想详细了解的,推荐链接

5.数组和切片的区别

  1.数组长度是固定的,切片长度可以调整

  2.数组是值类型,意思是只要你类型,长度,数值相等,两个数组就相等,而切片除了和nil比较外不能和其他切片比较。

  3.由数组转换而来的切片是原数组的一种展示,即修改切片中的值原数组也会相应改变。

  注意:

  在函数的参数传递中,由于数组是值类型,所以传递的是值的拷贝,即对参数进行操作不会影响原数组。而切片当参数传递时可以直接改变原切片。数组传递地址可以达到和切片一样的效果。

  切片会保留对原数组的引用,所以只要切片还在,数组占用的内存不会被回收,所以只需要使用数组部分的时候建议使用copy函数,创建一个切片的拷贝,原数组也能被回收。

 

posted @ 2021-06-04 00:03  雪が降る  阅读(31)  评论(0编辑  收藏  举报