gpt4 book ai didi

go - 为 big.Int 创建了类型别名 - 但我无法使用其指针接收器设置它?

转载 作者:数据小太阳 更新时间:2023-10-29 03:44:10 25 4
gpt4 key购买 nike

我认为类型别名比嵌入结构更优雅。你看,如果我创建一个嵌入 big.Int 的新类型 BigInt,我必须注意嵌入的 big.Int 始终被初始化,并且除非我重新实现 big.Int,比如 Cmp、Add、Sub,所有依赖于这个新类型的代码都需要知道 BigInt 的方法实际上接收到一个 big.Int对于他们的论点。这是愚蠢的。

所以我尝试给类型起别名。

type BigInt big.Int

// String casts BigInt into big.Int and uses its String method.
func (b *BigInt) String() string {
bc := big.Int(*b)
return bc.String()
}

但是现在设置指针接收器非常棘手,因为我无权访问 big.Int 的内部结构。以下代码根本不起作用:

// UnmarshalJSON casts BigInt into big.Int and uses its UnmarshalJSON method.
func (b *BigInt) UnmarshalJSON(text []byte) error {
bc := new(big.Int)
err := bc.UnmarshalJSON(text)
if err != nil {
return err
}
b = b.Set(bc)
return nil
}

// Set is different from big.Int.Set() in that you must use the value it returns
func (b *BigInt) Set(i *big.Int) *BigInt {
iB := BigInt(*i)
b = &iB
return b
}

我能做什么?

最佳答案

那不是类型别名,它是一种新类型,因此 没有 底层 big.Int 类型的方法。类型别名是 type BigInt = big.Int,但您无法在其上定义新方法。一个类型的方法被锁定在它的包中:没有办法在一个导入的类型上定义方法除了它已经定义的方法。嵌入是您可能最接近的方法。您更有可能想要重新考虑您的设计,最有可能的方法是创建采用 big.Int 的函数,而不是尝试定义新方法。

关于go - 为 big.Int 创建了类型别名 - 但我无法使用其指针接收器设置它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56429670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com