登录
首页 >  Golang >  Go问答

打印 Go 结构中 *big.Int 字段的值

来源:stackoverflow

时间:2024-03-16 12:00:30 464浏览 收藏

Go 中,将 *big.Int 类型的字段存储在结构体中时可能会遇到溢出问题。这是因为默认情况下,打印结构体只会打印指针的值,而不是它指向的值。为了解决这个问题,可以将字段导出,这样 fmt.Println 将显示基础值;或者直接传递 *big.Int 值给 fmt.Println,这样可以访问其自定义字符串格式化代码。

问题内容

我有一个big.int,我需要存储在结构内部,但是当我尝试这样做时它会溢出。代码示例如下

type NumberStore struct {
  mainnumber *big.Int
 }
var ledger NumberStore
// In decimal this is 33753000000000000000
var largehex string = "1D46ABEAB3FC28000"
myNumber := new(big.Int)
myNumber.SetString(largehex, 16)
ledger.mainnumber = myNumber
fmt.Println(ledger)// Prints 0xc0000a64c0, but I need it to be 33753000000000000000

正确答案


由于 mainnumbernumberstore 结构中的指针字段,因此默认情况下打印该结构只会打印指针的值,而不是它指向的值。

正如评论所说,如果您将字段导出,那么 fmt.println 将显示基础值;但如果您不需要导出它,那么 fmt.println(ledger.mainnumber) 应该打印您期望的数字。这是完整的代码,最后添加了一行:

package main

import (
    "fmt"
    "math/big"
)

type numberstore struct {
    mainnumber *big.int
}

func main() {

    var ledger numberstore
    // in decimal this is 33753000000000000000
    var largehex string = "1d46abeab3fc28000"
    mynumber := new(big.int)
    mynumber.setstring(largehex, 16)
    ledger.mainnumber = mynumber
    fmt.println(ledger)
    fmt.println(ledger.mainnumber)
}

Run on the Playground,它打印:

{0xc000092000}
33753000000000000000

通过像 fmt.println(ledger) 这样的打印,您依赖于值 ledger 的默认格式。对于结构中的每个字段,它只会打印该值的默认表示形式,除非它可以访问该类型的适当的自定义格式代码。对于 *big.int 类型的 mainnumber,即“指向 big.int 的指针”,它只是打印指针地址。

为了让 fmt 访问 *big.int 值的自定义字符串格式化代码,您需要直接传递它:fmt.println(ledger.mainnumber),或将 mainnumber 更改为导出字段,像这样:

type NumberStore struct {
    Mainnumber *big.Int
}

如果它是未导出的结构体字段,则 fmt 包无法自动找到该值的格式化代码(.string() string 方法)。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《打印 Go 结构中 *big.Int 字段的值》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>