Browse Source

结构体

fengchun_yuan 2 years ago
parent
commit
43c158b93a
2 changed files with 107 additions and 6 deletions
  1. 49 1
      Go语言101/system.md
  2. 58 5
      Go语言101/system/main.go

+ 49 - 1
Go语言101/system.md

@@ -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的底层类型相同 (要考虑字段标签)并且只要它们其中有一个为无名类型,则此转换可以是隐式 的。
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 58 - 5
Go语言101/system/main.go

@@ -2,10 +2,63 @@ package main
 
 import "fmt"
 
+type Book struct {
+	title, author string
+	pages         int
+}
+
 func main() {
-	p := new(int)
-	fmt.Println(p, *p)
-	b := 1
-	q := &b
-	fmt.Println(q, *q)
+	// {
+	// 	//指针
+	// p := new(int)
+	// fmt.Println(p, *p)
+	// b := 1
+	// q := &b
+	// fmt.Println(q, *q)
+	// }
+
+	// {
+	// 	//结构体
+
+	// 	book := Book{"Go语言101", "老貘", 256}
+	// 	fmt.Println(book) // {Go语言101 老貘 256}
+
+	// 	// 使用带字段名的组合字面量来表示结构体值。
+	// 	book = Book{author: "老貘", pages: 256, title: "Go语言101"}
+	// 	// title和author字段的值都为空字符串"",pages字段的值为0。
+	// 	book = Book{}
+	// 	// title字段空字符串"",pages字段为0。
+	// 	book = Book{author: "老貘"}
+
+	// 	// 使用选择器来访问和修改字段值。
+	// 	var book2 Book // <=> book2 := Book{}
+	// 	book2.author = "Tapir"
+	// 	book2.pages = 300
+	// 	fmt.Println(book2.pages) // 300
+
+	// 	var _ = Book{
+	// 		author: "老貘",
+	// 		pages:  256,
+	// 		title:  "Go语言101", // 这里行尾的逗号不可省略
+	// 	}
+
+	// }
+
+	{
+		//在字段选择器中,属主结构体值可以是指针,它将被隐式解引用
+		type Book struct {
+			pages int
+		}
+		book1 := &Book{100} // book1是一个指针
+		book2 := new(Book)  // book2是另外一个指针 new 新建的是指针
+		fmt.Println(book1, book2)
+		// 像使用结构值一样来使用结构体值的指针。
+		book2.pages = book1.pages
+		fmt.Println(book1.pages == book2.pages)
+		// 上一行等价于下一行。换句话说,上一行
+		// 两个选择器中的指针属主将被自动解引用。
+		(*book2).pages = (*book1).pages
+
+	}
+
 }