在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
1. 简介结构体类似于Java中的类,一般定义方式如下: 结构体类型和字段的命名遵循可见性规则,即大写开头的外部可见; 结构体的完全类型名称为:包名.结构体名称(中间有个点) type identifier struct { field1 type1 field2 type2 ... } 2. 初始化方式new(Type) 和 &Type{} 是等价的 初始化示例时,不显示指明字段类型时,必须按照 字段定义顺序赋值,且必须所有字段都要赋值; // 分配内存,并将属性初始化为所属类型的零值,返回一个指向该内存的指针 person := new(Person) fmt.Printf("person:%v \n",person) // person:&{0 0} person.id=1 person.name="chen" person.age=24 fmt.Printf("person:%v \n",person) // person:&{1 chen 24} // 底层仍然调用 new(),值顺序严格按照字段顺序 person2 := &Person{2,"wang",25} // person:&{2 wang 25} fmt.Printf("person:%v \n",person2) // 此时也会分配内存,并将属性初始化为所属类型的零值 var person3 Person fmt.Printf("person:%v \n",person3) // person:{0 0} person3 = Person{3,"zhao",22} fmt.Printf("person:%v \n",person3) // person:{3 zhao 22} person4 := Person{4,"sun",22} fmt.Printf("person:%v \n",person4) // person:{4 sun 22} 显示指明字段时,则不用按照字段顺序赋值,也可忽略某些字段 // 显示指明字段名称及其对应值 var person5 = Person{ id:5,name:"pp5"} fmt.Printf("person:%v \n",person5) // person:{5 pp5 0} 3. 带标签的结构体定义结构体字段时,可以给字段添加标签,并通过 reflect 获取字段对应的标签(tag) type struct1 struct { id int "an id" name string "name of struct1" } st1 := struct1{12, "zhangsan"} str1 := reflect.TypeOf(st1) field1 := str1.Field(0) // 输出:struct1 field1 name:id, tag:an id fmt.Printf("struct1 field1 name:%v, tag:%v \n", field1.Name, field1.Tag) field2 := str1.Field(1) // 输出:struct1 field2 name:name, tag:name of struct1 fmt.Printf("struct1 field2 name:%v, tag:%v \n", field2.Name, field2.Tag) 4. 匿名字段匿名字段,即在定义结构体时,只定义字段的类型,不定义字段的名称; 匿名字段的字段名默认为 字段类型的名称,所以一个结构体中同一类型的匿名字段最多只能存在一个,不同类型的匿名字段可存在多个; type struct1 struct { id int string } st1:= struct1{1,"12"} // 输出:1 12 fmt.Println(st1.id,st1.string) st1.string="123" // 输出:1 123 fmt.Println(st1.id,st1.string) 5. 内嵌结构体type a struct { id int name string } type b struct { a age int name string } b1:=b{a{1,"a"},12,"bb"} fmt.Println(b1) // {{1 a} 12 bb} // 内外层字段不同时,可直接通过字段名操作内层字段 fmt.Println(b1.id) // 1
|
请发表评论