|
@@ -147,4 +147,52 @@ Go指针值是支持(使用比较运算符==和!=)比较的。 但是,两
|
|
|
|
|
|
1. 这两个指针的类型相同。
|
|
|
2. 其中一个指针可以被隐式转换为另一个指针的类型。换句话说,这两个指针的 类型的底层类型必须一致并且至少其中一个指针类型为无名的(考虑结构体字 段的标签)。
|
|
|
-3. 其中一个并且只有一个指针用类型不确定的nil标识符表示。
|
|
|
+3. 其中一个并且只有一个指针用类型不确定的nil标识符表示。
|
|
|
+
|
|
|
+# 结构体
|
|
|
+
|
|
|
+## 结构体类型和其字面量表现形式
|
|
|
+
|
|
|
+一个结构体类型的尺寸为它的所有字段的(类型)尺寸之和加上一些填充字节的数目。编译器会在一个结构体值的两个相邻字段之间填充一些字节来保证一些字段的地址总是某个整数的倍数。
|
|
|
+
|
|
|
+结构体值的赋值
|
|
|
+
|
|
|
+```go
|
|
|
+1| func f() {
|
|
|
+2| book1 := Book{pages: 300}
|
|
|
+3| book2 := Book{"Go语言101", "老貘", 256}
|
|
|
+4|
|
|
|
+5| book2 = book1
|
|
|
+6| // 上面这行和下面这三行是等价的。
|
|
|
+7| book2.title = book1.title
|
|
|
+8| book2.author = book1.author
|
|
|
+9| book2.pages = book1.pages
|
|
|
+10| }
|
|
|
+```
|
|
|
+
|
|
|
+## 结构体字段的可寻址性
|
|
|
+
|
|
|
+如果一个结构体值是可寻址的,那它的字段也是可寻址的;反之,不可寻址的结构体值的字段也是不可寻址的。不可寻址的字段的值是不可更改的。所有组合的字面量都是不可寻址的。
|
|
|
+
|
|
|
+## 在字段选择器中,属主结构体值可以是指针,它将被隐式解引用
|
|
|
+
|
|
|
+## 结构体值的比较
|
|
|
+
|
|
|
+可以比,但没必要
|
|
|
+
|
|
|
+## 结构体值的类型转换
|
|
|
+
|
|
|
+两个类型分别为S1和S2的结构体值只有在S1和S2的底层类型相同(忽略掉字段标 签)的情况下才能相互转换为对方的类型。 特别地,如果S1和S2的底层类型相同 (要考虑字段标签)并且只要它们其中有一个为无名类型,则此转换可以是隐式 的。
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|