【20天学Go】Day 7: 结构体 学习时间4-5小时 学习目标掌握结构体的定义和使用 难度★★★☆☆1. 结构体定义packagemainimportfmt// 定义结构体typePersonstruct{NamestringAgeintCitystring}funcmain(){// 创建实例varp1 Person p1.Name张三p1.Age20// 字面量初始化p2:Person{Name:李四,Age:25,City:北京}p3:Person{王五,30,上海}// 按顺序// 访问字段fmt.Println(p2.Name,p2.Age)// 结构体指针p4:Person{Name:赵六,Age:35}fmt.Println(p4.Name)// 自动解引用// new创建p5:new(Person)p5.Name孙七}2. 方法typeRectanglestruct{Widthfloat64Heightfloat64}// 值接收者func(r Rectangle)Area()float64{returnr.Width*r.Height}// 指针接收者可以修改func(r*Rectangle)Scale(factorfloat64){r.Width*factor r.Height*factor}funcmain(){rect:Rectangle{10,5}fmt.Println(rect.Area())// 50rect.Scale(2)fmt.Println(rect.Area())// 200}3. 嵌入组合typeAddressstruct{CitystringCountrystring}typeEmployeestruct{NamestringAddress// 嵌入}funcmain(){e:Employee{Name:张三,Address:Address{City:北京,Country:中国,},}// 直接访问嵌入字段fmt.Println(e.City)// 北京fmt.Println(e.Address.City)// 也可以}4. 标签typeUserstruct{IDintjson:idNamestringjson:name validate:requiredAgeintjson:age,omitempty}// 反射读取标签importreflectt:reflect.TypeOf(User{})field,_:t.FieldByName(Name)fmt.Println(field.Tag.Get(json))// name5. 小结[结构体] 1. type Name struct { } 2. 字段访问s.Field 3. 值类型 [方法] 4. func (r Type) Method() 5. 值接收者 vs 指针接收者 [嵌入] 6. 匿名字段组合 7. 提升字段和方法 [标签] 8. key:value 9. 用于序列化等下一篇预告Day 8 - 接口