接口值的拷贝问题

来源:2-7 指针

小夏阿姨

2022-03-22

老师,请问一下,我有一个结构体实现了某个接口,但初始赋值时是指针类型,现在我想拷贝出来一个新的值来用,示例如下

type Worker interface {
	Work()
}

type Man struct {
	Name string
}

func (m *Man) Work() {
	fmt.Printf("i am %s, i can work\n", m.Name)
}

func main() {
	// 没有用接口, 这样写没问题
	var m1 = &Man{}
	var m2 = new(Man)

	*m2 = *m1
	fmt.Printf("%p %p\n", m1, m2)

	// 用接口时, 类似于上面, 只是换成了接口
	var w1 Worker = &Man{}
	var w2 Worker
	// todo:我需要拷贝一个w1出来给w2,w2最后也要是一个指针类型
	fmt.Printf("%p %p\n", w1, w2)
}
写回答

1回答

ccmouse

2022-05-10

不推荐这样做,接口的作用就是把底下具体的实现进行抽象。这里只有一个方法叫做Work(),所以这个Worker接口只有这一个能力,一旦变量被赋值为一个Worker接口的实例,我们就不再关心它是不是指针,也不再关心它能不能拷贝。如果我们想去试图拷贝它,就违反了接口的初衷。

实在要拷贝,我们可以加一个方法到Worker:Copy(shallow bool) Worker

告诉使用Worker的人,Worker是支持拷贝的,那么Man结构就可以顺其自然的实现Copy。另外,我还加了个参数,说是深拷贝(就是要包括所有的字段,以及如果字段是指针的话,指向的内容也要拷贝)还是浅拷贝,给这个例子加了一点现实意义。

0
1
小夏阿姨
明白 我现在是用反射来实现的,也还行,就是函数跳转失效了
2022-05-10
共1条回复

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程