接口值的拷贝问题
来源: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。另外,我还加了个参数,说是深拷贝(就是要包括所有的字段,以及如果字段是指针的话,指向的内容也要拷贝)还是浅拷贝,给这个例子加了一点现实意义。
012022-05-10