2 | Golang: 笔记
Go语言允许用户定义类型。当用户声明一个新类型时,这个声明就给编译器提供了一个框架,告知必要的内存大小和表示信息。声明后的类型与内置类型的运作方式类似。
Go语言里声明用户定义的类型有两种方法。最常用的方法是使用关键字struct,它可以让用户创建一个结构类型。
零值:当声明变量时,这个变量对应的值总是会被初始化。这个值要么用指定的值初始化,要么用零值(即变量类型的默认值)做初始化。
- 对数值类型来说,零值是0;
- 对字符串来说,零值是空字符串;
- 对布尔类型,零值是false。
- 结构里每个字段都会用零值初始化。
任何时候,创建一个变量并初始化为其零值,习惯是使用关键字var。
1 | type user struct{ |
方法:本质上还是函数,但是在 func 和 名称之间,多了一个括号,表示这个方法属于某个 struct。
关键字func和函数名之间的参数被称作接收者,将函数与接收者的类型绑在一起。如果一个函数有接收者,这个函数就被称为方法。
两种类型的接收者:值接收者和指针接收者。
如果使用值接收者声明方法,调用时会使用这个值的一个副本来执行。即:修改无效,当方法执行完之后,不会对接收者产生影响;指针接受者则相反。
类型的本质
内置类型:数值类型、string和bool
当把这些类型的值传递给方法或者函数时,传递对应值的副本。
引用类型:slice、map、channel、interface 和 func
声明上述类型的变量时,创建的变量被称作标头(header)值。从技术细节上说,字符串也是一种引用类型。每个引用类型创建的标头值是包含一个指向底层数据结构的指针。每个引用类型还包含一组独特的字段,用于管理底层数据结构。因为标头值是为复制而设计的,所以永远不需要共享一个引用类型的值。标头值里包含一个指针,因此通过复制来传递一个引用类型的值的副本,本质上就是在共享底层数据结构。
Reference
- 威廉·肯尼迪(William Kennedy),布赖恩·克特森(ian Ketelsen),埃里克·圣马丁(BrErik St. Martin). Go语言实战(异步图书) (Chinese Edition) (p. 84). 人民邮电出版社. Kindle 版本.
2 | Golang: 笔记