Golang 使用 type 重命名

1、重命名并增加新的方法

type student struct {
	name string
	sex  int
}

type monitor student//可以添加方法,但不可以增加字段

func (t *monitor) getName() string {
	return t.name
}
func main() {
    person1 := monitor{name: "xiao", sex: 1}
    fmt.Println(person1)
    fmt.Println(person1.getName())
}

输出:

{xiao 1}
xiao

2、重命名并实现接口

type Person interface {
	getName() string
}
type student struct {
	name string
	sex  int
}

type monitor student

func (t monitor) getName() string {
	return t.name
}
func main() {
	var person Person
	person = monitor{name: "xiao", sex: 1}
	fmt.Println(person)
	fmt.Println(person.getName())

}

输出

{xiao 1}
xiao

3、应用

背景:已存在结构体student 和 staff,在不改动原来代码的情况下(项目代码不能随意更改),需要使他们同时实现 Person 接口

//原来存在的结构体
type Student struct {
	name string
	sex  int
}
type Staff struct {
	name    string
	workage int
}

//需要实现的接口
type Person interface {
	getName() string
}

思路: 使用type 重命名  student 和 staff,并让新的结构体实现Person接口

type Monitor Student

func (t Monitor) getName() string {
	return t.name
}

type Manager Staff

func (t Manager) getName() string {
	return t.name
}

验证:

func main(){
	var person1 Person
	person1 = Monitor{name: "xiao", sex: 1}
	var person2 Person
	person2 = Manager{name: "wang", workage: 10}
	print(person1)
	print(person2)
}
func print(in interface{}) {
	switch in.(type) {
	case Monitor:
		mo := in.(Monitor) // 将接口参数转换成特定结构体
		fmt.Printf("我是班长,我的名字叫做 %s\n", mo.getName())
	case Manager:
		ma := in.(Manager)
		fmt.Printf("我是经理,我的名字叫做 %s\n", ma.getName())
	}
}

输出: 

我是班长,我的名字叫做 xiao
我是经理,我的名字叫做 wang

4、使用结构体时的 * 和 &(本节与主题无关,仅作记录)

第3节的代码可以改写为:


type Student struct {
	name string
	sex  int
}
type Staff struct {
	name    string
	workage int
}

type Person interface {
	getName() string
}

type Monitor Student

func (t Monitor) getName() string {
	return t.name
}

type Manager Staff

func (t *Manager) getName() string {// 使用指针变量
	return t.name
}
func main() {
	var person1 Person
	person1 = Monitor{name: "xiao", sex: 1}// 将结构体赋值给 接口变量
	var person2 Person
	person2 = &Manager{name: "wang", workage: 10}//将指针赋值给 接口变量
	print(person1)
	print(person2)
}
func print(in interface{}) {
	switch in.(type) {
	case Monitor:
		mo := in.(Monitor)
		fmt.Printf("我是班长,我的名字叫做 %s\n", mo.getName())
	case *Manager:
		ma := in.(*Manager) //指针类型
		fmt.Printf("我是经理,我的名字叫做 %s\n", ma.getName())
	}
}

输出:

我是班长,我的名字叫做 xiao
我是经理,我的名字叫做 wang


版权声明:本文为qq_38444415原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。