结构体(struct)的使用

package main

import "fmt"

// Human 定义一个名为Human的结构体
type Human struct {
   Name string // 姓名(字段名为Name,字段类型为string)
   Age  int    // 年龄(字段名为Age,字段类型为int)
   Sex  string // 性别(字段名为Sex,字段类型为string)
}

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

// Anonymous 结构体匿名字段使用示例
// 重要说明:以下代码虽然可以通过编译,但是并不规范的,实际开发中不应该使用,不规范的地方有两处:
//      1、匿名嵌入基础数据类型string,如果需要匿名嵌入,应该只嵌入结构体(不管是标准库的还是自定义的);
//      2、使用语言关键字int作为字段名,虽然Go语言没有禁止使用关键字作为变量名或字段名,但应该避免这样做。
type Anonymous struct {
   string     // 匿名字段
   int    int // 字段名和字段类型相同
}

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

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

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

   // ========== 定义结构体变量方式四 ==========//
   human4 := &Human{}    // 等价于:var human4 *Human = &Human{},花括号里也可以直接赋值(参考方式二)。
   (*human4).Name = "赵六" // 提醒:这里也可以用『human4.Name = "赵六"』的语法糖,但不建议使用。
   (*human4).Age = 15
   (*human4).Sex = "男"
   (*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    // 年龄
      Sex  string // 性别
   }{}
   (*human5).Name = "孙七"
   (*human5).Age = 14
   (*human5).Sex = "女"
   fmt.Printf("俺叫%v%v),今年%v岁。\n", (*human5).Name, (*human5).Sex, (*human5).Age)
   // 俺叫孙七(女),今年14岁。
}

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

Copyright © 2024 码农人生. All Rights Reserved