在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
结构体是用户定义的类型,表示若干个字段(Field)的集合。有时应该把数据整合在一起,而不是让这些数据没有联系。这种情况下可以使用结构体。 例如,一个职员有
type Employee struct { firstName string lastName string age int } 在上面的代码片段里,声明了一个结构体类型 type Employee struct { firstName, lastName string age, salary int } 上面的结构体 声明结构体时也可以不用声明一个新类型,这样的结构体类型称为 匿名结构体(Anonymous Structure)。 var employee struct { firstName, lastName string age int } 上述代码片段创建一个匿名结构体 emp3 := struct { firstName, lastName string age, salary int }{ firstName: "Andreah", lastName: "Nikola", age: 31, salary: 5000, } 上述代码片段通过匿名结构体 创建了一个结构体变量 。
结构体基础使用
package main import ( "fmt" ) //结构体为类型定义 //创建一个结构体,四个数据属性,四个函数属性 ///////////////////////////////////// type Person struct { name string age int sex bool //hobby []string } //*Person意味传递是真实地址 func (p *Person)Eat(){ fmt.Printf("%s爱吃西红柿炒鸡蛋\n",p.name) } func (p *Person)Drink(){ fmt.Printf("%s爱喝可乐\n",p.name) } func (p *Person)Sleep(){ fmt.Printf("%s要睡8个小时\n",p.name) } func (p *Person)Love(){ fmt.Printf("%s喜欢\n",p.name) } //////////////////////////////////////////// //值传递与属性传递 //////////////////////// func MakeHimLove(p Person){p.Love()} func MakeHisPtrLove(p *Person){p.Love()} ///////////////////// func main(){ //////结构体变量初始化/////////////// //顺序初始化:创建对象时按顺序给所有属性赋值 p1 := Person{"lili",8,true} fmt.Println(p1) //指定成员初始化:指定成员变量进行赋值,没有指定的成员变量为默认值 p2 := Person{name:"mingming",sex:true} //--未初始化的成员变量,取该数据类型的默认值。 fmt.Println(p2) //创建后初始化: p3 := Person{} //--未初始化的成员变量,取该数据类型的默认值。 p3.name ="xiaoli" p3.age =19 fmt.Println(p3) //////////////////////// ///////////结构体指针变量初始化///////////// //一般初始化 var p4 *Person = &Person{"weiai",26,true} fmt.Println(p4) //使用new初始化 p5 := new(Person) p5.name ="titi" p5.age =31 p5.sex =false //注意:在64位操作系统下,所有类型的指针,均为8个字节 //////////////////////// ///////////结构体变量的比较和赋值///////////// //1.比较:只能使用 ==和!= 不能使用 > < >= <= //注意:结构体有些类型存在,结构体变量是不能进行比较的,如:[]string
补充知识点
匿名字段当我们创建结构体时,字段可以只有类型,而没有字段名。这样的字段称为匿名字段(Anonymous Field)。 以下代码中有 package main import ( "fmt" ) type Person struct { string int } func main() { p := Person{"Naveen", 50} fmt.Println(p) } 该程序输出 虽然匿名字段没有名称,但其实匿名字段的名称就默认为它的类型。比如在上面的
嵌套结构体(Nested Structs)结构体的字段有可能也是一个结构体。这样的结构体称为嵌套结构体。 package main import ( "fmt" ) type Address struct { city, state string } type Person struct { name string age int address Address } func main() { var p Person p.name = "Naveen" p.age = 50 p.address = Address { city: "Chicago", state: "Illinois", } fmt.Println("Name:", p.name) fmt.Println("Age:",p.age) fmt.Println("City:",p.address.city) fmt.Println("State:",p.address.state) } 上面的结构体 Name: Naveen Age: 50 City: Chicago State: Illinois
提升字段(Promoted Fields)如果是结构体中有匿名的结构体类型字段,则该匿名结构体里的字段就称为提升字段。这是因为提升字段就像是属于外部结构体一样,可以用外部结构体直接访问。我知道这种定义很复杂,所以我们直接研究下代码来理解吧。 type Address struct { city, state string } type Person struct { name string age int Address } 在上面的代码片段中, package main import ( "fmt" ) type Address struct { city, state string } type Person struct { name string age int Address } func main() { var p Person p.name = "Naveen" p.age = 50 p.Address = Address{ city: "Chicago", state: "Illinois", } fmt.Println("Name:", p.name) fmt.Println("Age:", p.age) fmt.Println("City:", p.city) //city is promoted field fmt.Println("State:", p.state) //state is promoted field } 在上面代码中的第 26 行和第 27 行,我们使用了语法 Name: Naveen Age: 50 City: Chicago State: Illinois
导出结构体和字段如果结构体名称以大写字母开头,则它是其他包可以访问的导出类型(Exported Type)。同样,如果结构体里的字段首字母大写,它也能被其他包访问到。 让我们使用自定义包,编写一个程序来更好地去理解它。 在你的 Go 工作区的 在 package computer type Spec struct { //exported struct Maker string //exported field model string //unexported field Price int //exported field } 上面的代码片段中,创建了一个 package main import "structs/computer" import "fmt" func main() { var spec computer.Spec spec.Maker = "apple" spec.Price = 50000 fmt.Println("Spec:", spec) } 包结构如下所示: src structs computer spec.go main.go 在上述程序的第 3 行,我们导入了 如果我们试图访问未导出的字段 package main import "structs/computer" import "fmt" func main() { var spec computer.Spec spec.Maker = "apple" spec.Price = 50000 spec.model = "Mac Mini" fmt.Println("Spec:", spec) } 在上面程序的第 10 行,我们试图访问未导出的字段 refer:『GCTT 出品』Go 系列教程 —— 第 16 部分:结构体 |
请发表评论