如何将指针传递给函数中的结构?

时间:2017-03-31 09:04:47

标签: go

我想知道如何将*Type替换为?里面的结构是什么地址?

//mycode.go

package main

import "fmt"

func out(k *Type) {
    fmt.Println(k)
}

func main() {

    type DataIP struct{ Title, Desc string }

    Data := DataIP{
        "Hello!",
        "Hello GO!",
    }
    out(&Data)
}

2 个答案:

答案 0 :(得分:1)

我不确定你的问题。

如果您希望out仅适用于DataIP 类型的结构:

只需在main之外定义DataIP,然后使用签名func out(k *DataIP)

如果你想要的是能够将任何类型的结构传递给out

在golang中,可以使用 interface 类型实现这种泛型方法。正如this answer所解释的,接口是一个包含两个数据字的容器:

  1. 一个词用于指向值的基础类型
  2. 的方法表
  3. ,另一个词用于指向该值所持有的实际数据。
  4. 接口可以容纳任何东西,并且通常用作函数参数,以便能够处理多种输入。

    在您的情况下,您可以这样做:

    func out(k interface{}) {
        fmt.Println(k)
    }
    

    这将打印&{Hello! Hello GO!}。如果您希望&消失(即您总是传递指针),您可以使用reflect包来解除"取消引用" k

    func out(k interface{}) {
        fmt.Println(reflect.ValueOf(k).Elem())
    }
    

    产生{Hello! Hello GO!}

    这是playground example

    如果你想要的是打印Data 的地址:

    您可以将%p模式与fmt.Printf

    一起使用
    fmt.Printf("%p", &Data) // 0x1040a130
    

    使用out功能,您将获得:

    func out(k interface{}) {
        fmt.Printf("%p\n", k)
    }
    

    请参阅此playground example

答案 1 :(得分:1)

您需要在main()之外定义类型DataIP,类型在包的范围内,而不仅仅是在main函数内部:

package main

import "fmt"

type DataIP struct{ Title, Desc string }

func out(k *DataIP) {
    fmt.Println(k)
}

func main() {

    Data := DataIP{
        "Hello!",
        "Hello GO!",
    }
    out(&Data)
}

https://play.golang.org/p/cUS6ttcUy-