You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 19:47:12