大家一起学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()
}
发布了32 篇原创文章 · 获赞 5 · 访问量 7717

猜你喜欢

转载自blog.csdn.net/c0586/article/details/104214173