math/big包Set()方法与直接赋值的区别及指针相关疑问
Go中math/big.Int的Set方法与直接指针赋值的区别
核心差异:指针指向 vs 内部值拷贝
- 直接指针赋值:
myVar := newBig是对指针变量本身的赋值,此时myVar和newBig是两个独立的指针变量,但它们指向同一个big.Int实例。后续通过任意一个指针修改实例的内部值,另一个指针访问时都会看到变化。 - Set方法调用:
myVar.Set(newBig)是修改myVar指针指向的big.Int实例的内部数值,myVar这个指针变量的指向完全不变,只是把newBig指向实例的数值拷贝到myVar指向的实例中。
关于你的理解的纠正
你认为调用myVar.Set(newBig)后myVar会指向newBig的内存地址,这个理解是错误的。Set方法不会改变myVar指针本身的指向,仅修改其指向对象的内部数据。
代码示例对比
package main import ( "fmt" "math/big" ) func main() { // 直接指针赋值场景 newBig := big.NewInt(0) myVar1 := newBig fmt.Printf("myVar1 指针地址: %p, 指向的对象地址: %p\n", &myVar1, myVar1) fmt.Printf("newBig 指针地址: %p, 指向的对象地址: %p\n", &newBig, newBig) // 修改共享实例的值 newBig.Add(newBig, big.NewInt(5)) fmt.Println("myVar1 的值:", myVar1) // 输出 5,因为指向同一实例 // Set方法调用场景 myVar2 := big.NewInt(10) fmt.Printf("\nSet前 myVar2 指针地址: %p, 指向的对象地址: %p\n", &myVar2, myVar2) fmt.Printf("newBig 指向的对象地址: %p\n", newBig) myVar2.Set(newBig) fmt.Printf("Set后 myVar2 指针地址: %p, 指向的对象地址: %p\n", &myVar2, myVar2) fmt.Println("myVar2 的值:", myVar2) // 输出 5,但指向的仍是原实例 }
运行结果会清晰展示:
- 直接赋值时,两个指针的自身地址不同,但指向的对象地址完全一致;
- Set方法执行前后,
myVar2的自身地址和指向的对象地址均未改变,仅内部数值被替换。
Set方法的设计意义
big.Int用于处理超大整数,直接指针赋值会导致多指针共享同一实例,容易引发意外的并发修改或值篡改问题。Set方法允许在保留原有指针指向的前提下,拷贝其他实例的数值,适用于需要独立实例但复用已有值的场景,能避免共享实例带来的副作用。
内容的提问来源于stack exchange,提问作者flo
相关产品推荐
相关产品推荐

