结构体(struct)的使用

package main

import "fmt"

// Human 定义一个名为Human的结构体
type Human struct {
   Name   string // 姓名
   Age    int    // 年龄
   Gender string // 性别
}

// Intro Human结构体的自我介绍方法
func (hum *Human) Intro() {
   fmt.Printf("俺叫%v%v),今年%v岁。\n", hum.Name, hum.Gender, hum.Age)
}

// Anonymous 结构体匿名字段使用示例
type Anonymous struct {
   string     // 匿名字段(即没有字段名,只有字段类型),其实就是“string string   int    int // 字段名和字段类型相同
}

func main() {
   // ========== 定义结构体变量方式一 ==========//
   var human1 Human
   human1.Name = "张三"
   human1.Age = 18
   human1.Gender = "男"
   (&human1).Intro() // 俺叫张三(男),今年18岁。

   // ========== 定义结构体变量方式二 ==========//
   human2 := Human{
      Name:   "李四",
      Age:    17,
      Gender: "女",
   } // 等价于:var human2 Human = Human{...}
   (&human2).Intro() // 俺叫李四(女),今年17岁。

   // ========== 定义结构体变量方式三 ==========//
   human3 := new(Human)  // 等价于:var human3 *Human = new(Human)
   (*human3).Name = "王五" // 提醒:这里也可以用『human3.Name = "王五"』的语法糖,但不建议使用。
   (*human3).Age = 16
   (*human3).Gender = "男"
   (*human3).Intro() // 俺叫王五(男),今年16岁。

   // ========== 定义结构体变量方式四 ==========//
   human4 := &Human{}    // 等价于:var human4 *Human = &Human{},花括号里也可以直接赋值(参考方式二)。
   (*human4).Name = "赵六" // 提醒:这里也可以用『human4.Name = "赵六"』的语法糖,但不建议使用。
   (*human4).Age = 15
   (*human4).Gender = "男"
   (*human4).Intro() // 俺叫赵六(男),今年15岁。

   // ========== 结构体匿名字段的使用 ========== //
   anonymous := new(Anonymous)
   (*anonymous).string = "重案组の虎" // 说明:匿名字段和具名字段的使用其实没什么区别
   (*anonymous).int = 9527
   fmt.Printf("俺是%v,工号%v\n", (*anonymous).string, (*anonymous).int) // 俺是重案组の虎,工号9527。

   // ========== 匿名结构体的使用 ========== //
   human5 := &struct {
      Name   string // 姓名
      Age    int    // 年龄
      Gender string // 性别
   }{}
   (*human5).Name = "孙七"
   (*human5).Age = 14
   (*human5).Gender = "女"
   fmt.Printf("俺叫%v%v),今年%v岁。\n", (*human5).Name, (*human5).Gender, (*human5).Age)
   // 俺叫孙七(女),今年14岁。
}

// ========== 总结 ==========//
// 1、结构体入参通常使用其指针,而不是其本身,从而避免值拷贝消耗资源。
// 2、方式三和方式四可以使用『human.Name = "姓名"』的语法糖,虽然代码看起来更简洁了,也不影响性能,但不建议使用。
// 3、结构体在Go里的地位相当于类在Java里的地位,Go虽然弱化了面向对象的概念,但可以通过结构体来实现面向对象编程。
// 4、匿名结构体和匿名函数使用场景类似,在程序仅需要使用一次的情况下,可以将其设置为匿名。

Copyright © 2024 码农人生. All Rights Reserved