程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了为什么接口中存储的值无法在Golang中寻址大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决为什么接口中存储的值无法在Golang中寻址?

开发过程中遇到为什么接口中存储的值无法在Golang中寻址的问题如何解决?下面主要结合日常开发的经验,给出你关于为什么接口中存储的值无法在Golang中寻址的解决方法建议,希望对你解决为什么接口中存储的值无法在Golang中寻址有所启发或帮助;

为什么非指针值不能存储在可寻址的接口中?这是一个很好的问题,答案解释了为什么包含非​​指针值的接口不能成为具有指针接收器的方法的接收器,从而导致可怕的错误:@H_419_1@

<type> does not implement <interface> (<@R_419_6889@> method has pointer receiver)

@H_419_1@

存储在接口中的非指针值无法寻址以维护类型完整性。例如,当随后在接口中存储不同类型 的值时,指向 的指针(指向接口中类型 的值)将无效。 @H_419_1@

由于存储在接口中的非指针值不可寻址,因此编译器无法将其地址传递给具有指针接收器的方法。@H_419_1@

@H_419_1@

我在网上看到的答案没有多大意义。例如,本文说:@H_419_1@

的确,存储在接口中的值是不可寻址的,但据我所知并不是因为它存储在“隐藏的内存位置”。@H_419_1@

另一个常见的答案是:@H_419_1@

这没有任何意义,因为指向复制到接口的值的指针与指向复制到具体类型的值的指针没有什么不同。在这两种情况下,您都无法通过指向副本的指针来更改原始复制的值。@H_419_1@

那么,为什么不能将值存储在接口中呢?答案就在于在后续影响,如果它 可寻址。@H_419_1@

假设您有一个接口 和两个满足该接口的类型 和 :@H_419_1@

type I interface{}
type A int
type B string

创建一个 并将其存储在 :@H_419_1@

func main() {
    var a A = 5
    var i I = a
    fmt.Printf("i is of type %T\n", i)

假设我们可以采用存储在接口中的值的地址:@H_419_1@

    var aPtr *A
    aPtr = &(i.(A)) // not allowed, but if it were...

现在创建一个 并将其存储在 :@H_419_1@

    var b B = "hello"
    i = b
    fmt.Printf("i is of type %T, aPtr is of type %T\n", i, aPtr)
}

这是输出:@H_419_1@

i is of type main.A
i is of type main.B, aPtr is of type *main.A

将 放入 , 指向什么? 被声明为指向 ,但是 现在包含 ,并且 不再是指向 的有效指针。@H_419_1@

但是,这是允许的:@H_419_1@

    var aPtr *A
    var a2 A = i.(A)
    aPtr = &a2

因为第二行复制了 中的值,并且 没有指向 。@H_419_1@

那么,为什么包含非​​指针值的接口不能成为具有指针接收器的方法的接收器?由于存储在接口中的非指针值不可寻址,因此编译器无法将其地址传递给具有指针接收器的方法。@H_419_1@

解决方法

引用golangWiki(https://github.com/golang/go/wiki/MethodSets#interfaces):

“以相同的方式,存储在接口中的具体值不可寻址,即映射元素不可寻址。”

但是,关于接口尚不清楚。为什么无法寻址?这是因为某些硬性设计假设吗?

大佬总结

以上是大佬教程为你收集整理的为什么接口中存储的值无法在Golang中寻址全部内容,希望文章能够帮你解决为什么接口中存储的值无法在Golang中寻址所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: