我认为类型别名比嵌入结构更优雅。
您会发现,如果我创建嵌入BigInt
的新类型big.Int
,则必须注意始终对嵌入的big.Int进行初始化,除非重新实现big.Int就像Cmp ,添加,订阅,所有依赖于这种新类型的代码都需要知道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
}
我该怎么办?
答案 0 :(得分:2)
这不是类型别名,它是新类型,因此基础big.Int
类型的方法没有。类型别名为type BigInt = big.Int
,但是您无法在其上定义新方法。类型的方法被锁定在其包中:除了已经定义的方法以外,没有方法可以在导入的类型上定义方法。嵌入是您最可能达到的目标。您更有可能想重新考虑设计,最有可能的方法是创建带有big.Int
的函数,而不是尝试定义新方法。
答案 1 :(得分:-1)
我忘记了我也可以取消引用=
符号的指针接收器/左侧。这正是我想要的...
// Set makes a BigInt equal to a given big.Int.
func (b *BigInt) Set(i *big.Int) *BigInt {
iB := BigInt(*i)
*b = iB
return b
}