struct中匿名字段的妙用

outman · · 680 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

先来看一段代码:

package main

import "fmt"

type Say interface {
	Hello()
}

type Human struct {
	name string
	age  int
}

type Student struct {
	Human //匿名字段
	class string
}

//Student实现接口
func (man Human) Hello() {
	fmt.Printf("my name is:%s\n", man.name)
	fmt.Printf("my age is:%d\n", man.age)
}

func main() {

	stu := Student{Human{"outman", 18},"2班"}

	fmt.Printf("name:%s\n", stu.name)
	fmt.Printf("class:%s\n", stu.class)

	stu.Hello()
}

 

运行结果:

name:outman

class:2班

my name is:outman

my age is:18

 

有没有发现Student可以访问Human字段的成员和方法,像不像面向对象中的继承?对。没错,go语言用如此优雅的方式实现了

 

现在对代码稍加修改,在Student中加一个字段age,这样出现了两个age,在访问的时候该如何抉择呢?

package main

import "fmt"

type Say interface {
	Hello()
}

type Human struct {
	name string
	age  int
}

type Student struct {
	Human //匿名字段
	age   int
	class string
}

//Student实现接口
func (man Human) Hello() {
	fmt.Printf("my name is:%s\n", man.name)
	fmt.Printf("my age is:%d\n", man.age)
}

func main() {

	stu := Student{Human{"outman", 18}, 19, "2班"}

	fmt.Printf("name:%s\n", stu.name)
	fmt.Printf("class:%s\n", stu.class)

	stu.Hello()

	fmt.Printf("student age:%d\n", stu.age)
	fmt.Printf("human age:%d\n", stu.Human.age)
}

 

Go里面很简单的解决了这个问题,最外层的优先访问,也就是当你通过student.age访问的时候,是访问Student里面的字段,而不是Human里面的字段,这样就允许我们去重载通过匿名字段继承的一些字段,当然如果我们想访问重载后对应匿名类型里面的字段,可以通过匿名字段名来访问

 

总结:

1.结构体的匿名字段,可以实现继承的思想;

2.当结构中有和匿名字段相同的字段时,采用外层优先访问原则;

3.不仅仅是struct字段,所有的内置类型和自定义类型都是可以作为匿名字段;


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

680 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传