大家一起学Golang——结构体、方法

大家一起学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()
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值