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