Golang中的大整数:引用与值的探讨

Golang中的大整数:引用与值的探讨 我有一个关于大整数使用的问题。以下是程序和输出:

func main() {
	a := big.NewInt(1000)
	fmt.Println(*a)
	fmt.Println(a)
}

// {false [1000]}
// 1000

我想知道为什么大整数的引用值是我传入的值?

5 回复

尝试使用 %p 来打印指针值:

fmt.Printf("%p\n", a)

更多关于Golang中的大整数:引用与值的探讨的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


嗨,肖恩,你看到的是大整数的值而不是指针,因为 *big.Int 有一个 String 方法,根据 fmt 包概述中打印部分的默认格式规则,拥有该成员函数会导致默认格式改为调用该函数。

感谢您的帮助。我理解打印 *a 会同时返回 negabs。但对于打印 a,我原本以为应该打印出它的地址而不是值 1000,因为 big.NewInt 创建的是指向结构体 Int 的指针。

big.NewInt 返回一个 *Int该结构类型的源代码向我们展示了以下内容:

type Int struct {
	neg bool // 符号
	abs nat  // 整数的绝对值
}

因此打印 *a 会输出 negabs

在Go语言中,big.Int类型是一个结构体,它使用切片来存储大整数的数值部分,并使用一个布尔字段来标记符号。当你调用big.NewInt(1000)时,返回的是*big.Int(指针),而不是值类型。

在你的代码中:

  • fmt.Println(*a) 打印的是解引用后的big.Int结构体本身。结构体的内部表示包含一个符号字段(false表示正数)和一个存储数值的切片([1000]),因此输出为{false [1000]}
  • fmt.Println(a) 打印的是指针a,但由于big.Int类型实现了String()方法,fmt.Println会自动调用该方法来输出可读的字符串形式,即"1000"

实际上,big.Int设计为通过指针操作,以避免在函数间传递时复制整个结构体,从而提升大整数运算的性能。直接使用值类型可能会导致意外的行为,因为结构体内部的切片是引用类型。

示例代码说明:

package main

import (
	"fmt"
	"math/big"
)

func main() {
	a := big.NewInt(1000)
	b := *a  // 复制结构体值
	b.Add(&b, big.NewInt(500))
	
	fmt.Println("a:", a) // 输出: 1000
	fmt.Println("b:", &b) // 输出: 1500
}

这里,ba的值复制,修改b不会影响a,因为它们是不同的结构体实例。但在实际使用中,推荐始终使用指针操作big.Int,以避免复制开销和潜在错误。

回到顶部