【问题标题】:How to pass interface of struct type by reference in golang?如何在golang中通过引用传递结构类型的接口?
【发布时间】:2017-11-29 16:20:56
【问题描述】:

我需要通过引用传递一个结构类型的接口,如下所示。既然,我不能使用接口指针来构造类型变量,我应该如何更改下面的代码将te值修改为10?。

package main

import (
    "fmt"
)

func another(te *interface{}) {
    *te = check{Val: 10}
}

func some(te *interface{}) {
    *te = check{Val: 20}
    another(te)
}

type check struct {
    Val int
}

func main() {
    a := check{Val: 100}
    p := &a
    fmt.Println(*p)
    some(p)
    fmt.Println(*p)
}

谢谢!

P.S 我已经读过将指针传递给接口不是一个很好的做法。请让我知道有什么更好的方法来处理它

【问题讨论】:

  • Go 没有通过引用传递的概念。
  • @Volker:很抱歉这个词的滥用,但我希望你明白我的问题的意图
  • 要在 go 中执行类似于 pass-by-reference 的操作,您需要使用指针。
  • @LasseV.Karlsen:你能举个例子吗?我尝试过使用指针但没有成功
  • 为什么需要将指针传递给接口?如果您将一个指针传递给您的结构,并且该结构实现了所需的接口,那么您仍然会有一个指向引擎盖下的具体对象的指针。您尝试更改底层对象的事实似乎您可能不了解接口的用途。

标签: pointers go


【解决方案1】:

所以你正在使用一个接口,你需要某种保证,你可以设置结构成员的值?听起来你应该把保证作为界面的一部分,所以像:

type Settable interface {
    SetVal(val int)
}

func (c *check) SetVal(val int) {
    c.Val = val
}

func some(te Settable) {
    te.SetVal(20)
}

type check struct {
    Val int
}

func main() {
    a := check{Val: 100}
    p := &a
    some(p)
    fmt.Println(*p)
}

【讨论】:

  • 澄清一下:some(a) 不会编译,因为check 没有实现Settablesome(&a) 将起作用,因为 *check 确实实现了 Settable。顺便说一句,您可能想要删除p 变量并使用some(&a)fmt.Println(a) 来表明该函数实际上正在更改a 而不仅仅是p,因为新的地鼠可能认为您是更改 p 但不是 a
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-07
  • 2020-03-02
  • 1970-01-01
  • 2014-12-13
  • 2016-06-09
  • 1970-01-01
相关资源
最近更新 更多