type T struct {
Id int
Name string
}
func Copy(a *T, b *T) error {
b.Id=5
b.Name="gert"
a = b
return nil
}a仍然是空的,我必须这样做
func Copy(a *T, b *T) error {
b.Id = 5
b.Name = "gert"
a.Id = b.Id
a.Name = b.Name
return nil
}现在a和b是一样的
为什么以及如何将*b直接复制到*a?
发布于 2014-01-09 03:26:56
你的第一个例子几乎是正确的。传入指向两个对象的指针。您将这些指针放入变量A和B中,但是A和B是局部变量,所以当您说a=b时,您只是说“忘记A(本地)中的内容”。程序的其余部分仍然有指向这两个原始对象的指针。
如果要将B处的数据结构复制到A处的数据结构中,请执行以下操作:
*a = *b;正如dmikalova在下面的评论中所指出的,这只是复制了结构--但没有结构指向的任何数据。如果您的结构有一个指针,它所指向的数据现在由两个副本共享(因为它只复制了指针)。
从技术上讲,字符串始终是指针,因此它们从不作为结构的一部分进行复制。但是,因为字符串是不可变的(并且Go有垃圾收集),字符串“感觉”它们是您的结构的一部分,您不必担心低级别的字符串共享会神奇地节省内存,而不必考虑它。
发布于 2015-10-14 08:50:37
框架开发人员的通用解决方案:
func Copy(source interface{}, destin interface{}) {
x := reflect.ValueOf(source)
if x.Kind() == reflect.Ptr {
starX := x.Elem()
y := reflect.New(starX.Type())
starY := y.Elem()
starY.Set(starX)
reflect.ValueOf(destin).Elem().Set(y.Elem())
} else {
destin = x.Interface()
}
}所以:
Copy(old, new)请参阅play.golang.org中的代码,因此您可以在运行时传递任何类型,只要您确信源和destin都是相同的类型(而destin是指向该类型的指针)。
发布于 2014-01-09 03:34:12
在go中,参数通过值传递。
T是一个指向T的指针,把它想象成一个int,它告诉你T在哪里。因此,"a“指向T的一个实例,b指向另一个实例。
在您的复制函数中,您是说要指向b的"T“(如果这有意义的话)。你想说的是,A的T应该和b的T一样
你可以通过取消指针来做到这一点。
所以,用*a = *b代替a=b(更改局部变量"a“指向任何"b”)(将a的T改为等于b的T)。
希望这是有意义的,下面是一个你的应用程序被修改为“做正确的事情”的例子。注意,您的复制函数在这里没有必要,它是为了说明。玩法
import "fmt"
type T struct {
Id int
Name string
}
func Copy(a *T, b *T) error {
b.Id = 5
b.Name = "gert"
a = b
return nil
}
func CopyThatActuallyCopies(a *T, b *T) error {
b.Id = 5
b.Name = "gert"
*a = *b
return nil
}
func main() {
var a = &T{1, "one"}
var b = &T{2, "two"}
fmt.Println(a, b)
Copy(a, b)
fmt.Println(a, b)
CopyThatActuallyCopies(a, b)
fmt.Println(a, b)
}https://stackoverflow.com/questions/21011023
复制相似问题