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

时间:2019-06-03 14:42:34

标签: go

我认为类型别名比嵌入结构更优雅。 您会发现,如果我创建嵌入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
}

我该怎么办?

2 个答案:

答案 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
}