大家一起学Golang——结构体、方法
结构体类型
空结构体
结构体标签
匿名字段
方法
重写
结构体类型
结构体类型通过一系列的且唯一的字段来声明。在go中数组切片只能存储同一类型的数据,但结构体用户可以自定义将不同数据类型进行组合。
type Student struct{
name string
age int
}
初始化:
st := Student{
name: “Jeff”,
age: 18,
}
初始化时要换行,每一行要用逗号隔开。
st := Student{“Beniff”,19} 要注意每个字段初始化的顺序
空结构体
st := struct{}{}
占用空间0字节,返回都是固定内存地址。
var signChan = make(chan struct{}) 这样的通道用来接受struct{} 结构体信号的,因为空结构体不占内存空间。
aa := make(chan struct{},1)
aa <- struct{}{}
//bb <- aa
fmt.Println(<-aa) //<-aa 可以用于阻塞等待
- 作用: 空结构体在并发时,什么用?
结构体标签
通过反引号来括起,算是go语法上融合json数据格式吧
type Student struct{
Name string json:"name"
Age int json:"age"
}
to := reflect.TypeOf(People{})
for i := 0; i < to.NumField(); i++ {
field := to.Field(i)
tag := field.Tag.Get(“json”)
fmt.Println(tag) //获取到tag标签,好麻烦==!
}
匿名字段
go语言中没有继承,是通过结构体中字段成员的组合,来实现代码的复用,子类可以直接使用父类的结构体成员,包括字段(属性)和方法。
type AA struct {
aa string
}
type BB struct {
//AA结构体名为BB的匿名字段
AA
bb int
}
方法
go语言中,方法是绑定到一个具体类型的特殊函数,编译时静态绑定。方法可以为类型提供操作行为。
同一个类型的方法名要唯一,方法和函数一样不支持重载
func (方法接收者)方法名(参数列表)(返回值列表){
代码体
返回值
}
按方法接收者分为值接收者和指针接收者:
func (p Student)GetName() string{
return p.Name
}
func (p *Student)GetName() string{
return p.Name
}
该何时选用哪种接收者,需要我们判断绑定的类型若要创建新值,则选择用值接收者;若要修改当前值,则选指针接收者。
在面向对象语言中,子类继承父类,其中会用属性重名的情况。go语言中子对象调用重名的字段时,会调用子类的字段。
type AA struct {
Aa string
}
type BB struct {
AA
Aa string
}
func main(){
a := BB{
AA:AA{
Aa:"aa",
},
Aa:"bb",
}
a.Aa //调用BB的Aa
a.AA.Aa //调用AA的字段
}
重写
子结构体的方法,将父结构体同名的方法重写,在调用的时候先调用子结构的同名的方法。
type AA struct {
Aa string
}
type BB struct {
AA
Aa string
}
func (p *AA) GetA() {
fmt.Println(*p)
}
func (q *BB) GetA() {
fmt.Println(*q)
}
func main(){
a := BB{
AA1:AA{
Aa:"aa",
},
Aa:"bb",
}
a.GetA() //调用BB的GetA()方法
a.AA1.GetA() //调用AA的GetA()
}