注册 登录

清河洛

Go语言中的结构体

qingheluo2021-09-03清河洛331
数组可以存储同一类型的数据,但在结构体中可以为不同项定义不同的数据类型结构体是由一系列具有相同类型或不同类型的数据构成的数据集合定义结构体结构体定义需要使用type-struct语句type语句定义结构体的名称struct语句定义结构体中的成员type struct_name struct { item1 type item2 type ... itemn type } 定义了结构体类型,就能用于变量的声明和赋值:variable_name := struct_name {val1, val2...valn} 不指定item赋值时传入的值必须顺序和数量都和结构体一...

数组可以存储同一类型的数据,但在结构体中可以为不同项定义不同的数据类型

结构体是由一系列具有相同类型或不同类型的数据构成的数据集合

定义结构体

结构体定义需要使用type-struct语句

type语句定义结构体的名称

struct语句定义结构体中的成员

type struct_name struct {
   item1 type
   item2 type
   ...
   itemn type
}

定义了结构体类型,就能用于变量的声明和赋值:

variable_name := struct_name {val1, val2...valn}
不指定item赋值时传入的值必须顺序和数量都和结构体一致

variable_name := struct_name { item1: val1, item2: val2..., itemn: valn}
指定item赋值时传入的值的顺序和数量不需要和结构体一致,但是传入的item一定要是结构体中存在的,没有赋值的item会根据数据类型赋予默认值

访问结构体成员

使用点号(.)操作符来访问结构体的成员:variable_name.item

结构体指针

结构体作为一个特殊的自定义数据类型,使用指针时

var variable_name *struct_name

结构体指针变量访问结构体的成员时无需添加前缀星号,直接variable_name.item即可访问成员值

结构体实现 “继承”

Go语言本身并不支持继承,但可以使用组合的方法,实现类似继承的效果

定义两个结构体
type people struct{
    name string
    age int
}
type info struct{
    company string
    like string
}

以上两个结构体一个定义了一个人的姓名和年龄,一个定义了一个人的公司和爱好
能不能将两个结构体结合一下,实现类似继承的功能呢

我们修改people结构体
type people struct{
    name string
    age int
    info
}
将info嵌入到people中,做为people的一个匿名字段,这样people就直接拥有了info的所有属性了

使用时

myinfo := info{"XX公司","宅"}
me := people{"三千",33,myinfo}

这样就可以使用me.company和me.like获取相应的值了

继承时属性冲突

但是在继承时,如果出现属性名冲突会怎么样呢

type One struct {
    val  int
    name string
}

type Two struct {
    val int
    age int
}
以上是我们定义的两个结构体

type Num struct{
    name string
    One
    Two
}
Num结构体集成了两个结构体,而继承的两个结构体中都有val属性,而且Num结构体重的name属性也和One结构体中的name属性冲突
one := One{10,"san"}
two := Two{20,33}
num := Num{name:"qingheluo",One:one,Two:two}
fmt.Println(num.name) //qingheluo,由于Num本身就有string属性,会优先读取该属性
fmt.Println(num.val)  //报错,Num本身没有该属性,会在One和Two中寻找,两个都有val属性,不知道我们想要哪个属性
fmt.Println(num.Two.val) // 20,获取的时候在属性之前再加上结构体名称,会获取到指定的结构体中的值
fmt.Println(num.One.name) // san,会获取One结构体中的name属性值


网址导航