struct相当于面向对象中的class
1.go中的struct与c中的struct非常相识,并且go没有class;
2.使用type<Name>structP{}定义结构,名称遵循可见性规则;
3.支持指向自身的指针类型成员;
4.支持匿名结构,可用作成员或定义成员变量;
5.匿名结构也可以用于map的值;
6.可以使用字面值对结构进行初始化;
7.允许直接通过指针来读写结构成员;
8.相同类型的成员可进行直接拷贝赋值;
9.支持==或!=比较运算符,但不支持>或<;
10.支持匿名字段,本质上是定义了以某个类型名为名称的字段;
11.嵌入结构作为匿名字段看起来像继承,但不是继承;
12.可以使用匿名字段指针。
13.结构体名本身指向第一个元素的地址(即结构体地址与结构体内第一个属性值的地址相同)
14.结构体是值类型数据
struct可以使用两种方式初始化,即先创建一个结构体(类似对象),用属性赋值,或者直接创建结构体时赋值;
创建指向结构体的指针时,直接在结构体前面加&,就表示创建的是指向结构体的指针;要对属性进行修改时,前面不用加,直接结构体实例.属性,就可以赋值,如a.Age=20;但将指向结构的指针作为参数传递给函数时,函数的形参为定义的结构体,如下面的person,形参前面需要加上
import (
"fmt"
)
type person struct {
Name string
Age int
}
func main(){
a := person{}
a.Age = 13
a.Name = "bob"
fmt.Println(a)
b := person{
Name: "alice",
Age: 19,
}
fmt.Println(b)
c := &person{
Name:"joe",
Age:18,
}
fmt.Println(c)
}
匿名结构的结构体
func main(){
a := struct {
Name string
Age int
}{
Name: "alice",
Age: 19,
}
fmt.Println(a)
c := &struct {
Name string
Age int
}{
Name: "alice",
Age: 19,
}
fmt.Println(c)
}
嵌套结构:嵌套结构中的字段只能使用属性进行赋值,不能用构造结构体赋值
type person struct {
Name string
Age int
Contact struct{
Phone, City string
}
}
func main(){
a := person{Name:"Joe", Age:13}
a.Contact.Phone = "123123"
a.Contact.City = "成都"
fmt.Println(a)
}
匿名结构
匿名结构的结构体:实例化时,值必须与字段类型对应,否则会报错
type person struct {
string
int
}
func main(){
a := person{"Joe",13}
fmt.Println(a)
}
结构体用==比较,必须使用相同的结构体名创建的结构体,否则会报错
嵌入结构
嵌入结构类型py中的继承;用构造结构体初始化时用 a := teacher{Name:"Joe", Age:18,human:human{Sex:0}}这种方式;
用参数初始化时,方法如下。
type human struct {
Sex int
}
type teacher struct {
human
Name string
Age int
}
type student struct {
human
Name string
Age int
}
func main(){
a := teacher{Name:"Joe", Age:18,human:human{Sex:0}}
b := student{Name:"Joe", Age:21,human:human{Sex:0}}
fmt.Println(a)
b.Name="area"
b.Age = 22
// 用b.human.Sex=100也可以使用
b.Sex = 100
plt.Println(b)
}
网友评论