结构 struct

-Go 中的 struct 与 C 中的 struct 非常相似,并且 Go 没有 class
-使用 type <Name> struct{} 定义结构,名称遵循可见性规则
-支持指向自身的指针类型成员
-支持匿名结构,可用作成员或定义成员变量
-匿名结构也可以用作 map 的值
-可以使用字面值对结构进行初始化
-允许直接通过指针来读写结构成员
-相同类型的成员可以进行拷贝赋值
-支持 ==!= 比较运算符,但不支持 ><
-支持匿名字段,本质上是定义了以某个类型名为名称的字段
-嵌入结构作为匿名字段看起来像继承,但不是继承
-可以使用匿名字段指针

  1. type person struct{
  2. Name string
  3. Age int
  4. }
  5. func main() {
  6. //字母值初始化
  7. a := person{
  8. Name:"joe",
  9. }
  10. //赋值
  11. a.Age = 19
  12. fmt.Println(a)
  13. }

通过指针操作

  1. type person struct{
  2. Name string
  3. Age int
  4. }
  5. func main() {
  6. a := &person{
  7. Name: "joe",
  8. Age: 19,
  9. }
  10. a.Age = 13
  11. fmt.Println(*a)
  12. }

匿名结构

  1. func main() {
  2. a := struct{
  3. Name string
  4. Age int
  5. }{
  6. Name: "joe",
  7. Age: 19,
  8. }
  9. a.Age = 13
  10. fmt.Println(a)
  11. }

匿名结构嵌套

  1. type person struct {
  2. Name string
  3. Age int
  4. Contact struct {
  5. Phone, City string
  6. }
  7. }
  8. func main() {
  9. a := person{
  10. Name: "joe",
  11. Age: 19,
  12. }
  13. a.Contact.Phone = "18826996633"
  14. a.Contact.City = "beijing"
  15. fmt.Println(a)
  16. }

匿名字段

  1. type person struct {
  2. string
  3. int
  4. }
  5. func main() {
  6. //按照结构体中类型顺序赋值
  7. a := person{"joe",19}
  8. fmt.Println(a)
  9. }

拷贝赋值

  1. type person struct {
  2. string
  3. int
  4. }
  5. func main() {
  6. a := person{"joe",19}
  7. var b person
  8. b = a
  9. fmt.Println(b)
  10. }

结构体嵌入

  1. type human struct {
  2. Sex int
  3. }
  4. type teacher struct {
  5. human //此处 humen 是于匿名结构,相对与 humen humen
  6. Name string
  7. Age int
  8. }
  9. func main() {
  10. a := teacher{human: human{Sex:0},Name:"joe",Age:19}
  11. //Go 将 Sex 默认放到最外层,使 a 可直接调用
  12. a.Sex = 100
  13. fmt.Println(a)
  14. }