【问题标题】:Passing a struct by reference without passing as a *structobject in the function parameters通过引用传递结构而不作为函数参数中的 *structobject 传递
【发布时间】:2021-09-16 11:32:28
【问题描述】:

我需要传递一个结构体作为对函数的引用;但是,我不能在函数参数中使用指针 (*) 语法:

func abc(client cleintpassedasrefernce) {
    // make changes in client so that it will be updated in the client actual memory location
}


type clienttobepassasref struct {
    data int
    name string
} 

// calling abc function 
object = clienttobepassasref{}
abc(object)

也许我可以创建另一个结构,例如类型对象传递结构

{
    object *clienttobepassasref
}

并传递此对象并稍后在函数中访问它?

【问题讨论】:

    标签: go pointers


    【解决方案1】:

    您需要更改函数签名和调用函数的方法。此外,您还定义了一个名为 clienttobepassasref 的结构类型,但您的函数接受的结构类型为 cleintpassedasrefernce,这在您的示例中未定义。在我的示例中,我将它们替换为一个名为 MyObject 的结构类型。

    go playground

    package main
    
    import (
        "fmt"
    )
    
    type MyObject struct {
        data int
        name string
    }
    
    // accept a pointer to the object here using the '*' character
    func abc(obj *MyObject) {
        // make changes in client so that it will be updated in the client actual memory location
        obj.name = "foo"
    }
    
    func main() {
        // calling abc function
        object := MyObject{}
        abc(&object)
        // Pass it by reference here with the '&' character
        fmt.Println(object.name)
    }
    

    【讨论】:

    • 感谢您的快速恢复,正如我所提到的,我遇到了奇怪的情况,我无法通过 abc(&object) 下方的 & 符号,也无法在函数参数部分放置星号。正如 func abc(obj *MyObject) 一样,我的框架依赖于我可以定义函数名称和它可以采用的参数的 prevalidate、run 步骤,现在由于传递了我的引用,将会有大量的返工。所以想如果我可以通过某种方式传递对象的内存地址并在没有上面 & 和 * 的情况下获取它,可能是将要传递的对象放在包装器中
    • @vm-power 你能提供一个minimum reproducible example吗?我不确定您打算如何在不传递对对象的引用的情况下传递对对象的引用。继续尝试包装方法,如果没有你想要做什么的例子,我无能为力。
    【解决方案2】:

    如果您需要更新,更改结构的属性,然后创建一个具有该结构引用接收器的函数(方法),并在该函数(方法)中更新结构的属性。

    package main
    
    import "fmt"
    
    type MyObject struct {
        data int
        name string
    }
    
    func (obj *MyObject)abc() {
        // make changes in client so that it will be updated in the client actual memory location
        obj.name = `some name`
        obj.data = 10
    }
    
    func main() {
        // calling abc function
        object := &MyObject{}
        object.abc()
    
        fmt.Printf("object = %+v", *object)
        //object = {data:10 name:some name}
    }
    

    运行代码here

    获取更多知识的参考

    【讨论】:

      猜你喜欢
      • 2018-08-17
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 2018-09-22
      • 2014-04-23
      • 2022-01-11
      相关资源
      最近更新 更多