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}
xiao2、重命名并实现接口
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}
xiao3、应用
背景:已存在结构体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版权协议,转载请附上原文出处链接和本声明。