首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当值指向另一个实例时,go的big.Int底层值会发生变异

当值指向另一个实例时,go的big.Int底层值会发生变异
EN

Stack Overflow用户
提问于 2020-03-23 15:38:36
回答 1查看 72关注 0票数 0

当我将一个big.Int的实例指向另一个big.Int时,我遇到了go's big.Int的一些无法解释的行为。我知道,为了将bit.Int实例的值设置为另一个实例,必须使用Int.SetXXX设置器,因为它们实际上会导致将big.Int中的底层abs片复制到新分配的数组中。

请考虑以下几点:

错误的示例(基础值发生变异):

代码语言:javascript
复制
func main() {
    v1p := big.NewInt(1)
    v2p := big.NewInt(2)

    v1 := *v1p
    v2 := *v2p

    v2 = v1

    v1.SetInt64(3)

    fmt.Println(v1.Int64(), v2.Int64())
}

(在这里运行:https://play.golang.org/p/WxAbmGdKG9b)

正确的示例(值不发生变异):

代码语言:javascript
复制
func main() {
    v1p := big.NewInt(1)
    v2p := big.NewInt(2)

    v1 := *v1p
    v2 := *v2p

    v2.Set(v1p)

    v1.SetInt64(3)

    fmt.Println(v1.Int64(), v2.Int64())
}

(在这里运行:https://play.golang.org/p/16qsGhwHIWf)

如果我的理解是正确的,下面的内容将从根本上说明在错误的示例中发生了什么:

代码语言:javascript
复制
func main() {
    var a, b *int // analogous to the 2 big.Int pointers returned
    c, d := 3, 3
    a = &c // we set the pointers to point to something we can then dereference
    b = &d

    e := *a // e and f should now point to the values pointed to by the pointers
    f := *b

    // the rest is self-explanatory
    e = f

    c = 5
    d = 4

    fmt.Println(a, b, c, d, e, f)
}

(在这里运行:https://play.golang.org/p/cx76bnmJhG7)

我唯一的假设是,在错误的示例中,当将结构内容复制到v2时,所发生的情况是,abs片不会被深度复制,而是它引用的存储实际上与v1中的片所指向的存储相同。

真的是这样吗?根据语言规范,这也是预期的行为吗?

EN

回答 1

Stack Overflow用户

发布于 2020-03-24 08:17:24

正如icza和Volker所指出的那样,因为当取消引用big.Int指针时,实际的值片头结构被复制,指向相同的基础值,结果是从多个切片引用相同的基础数组,从而导致一个改变另一个。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60816742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档