在 Go Lang 中通过通道传递指针

Posted

技术标签:

【中文标题】在 Go Lang 中通过通道传递指针【英文标题】:Passing pointer through channel in Go Lang 【发布时间】:2014-01-17 20:26:51 【问题描述】:

可以在 go lang 中通过通道传递指针吗?我需要传递结构,对其进行更改并在传递结构的同一函数中进行这些更改?

我试过了

chan <- &data

我得到了

# command-line-arguments .\o.go:130: cannot use &duom[i] (type *KaVartoti) as type KaVartoti in send

之后我尝试了

chan <- *data

我得到了

# command-line-arguments .\o.go:130: invalid indirect of duom[i] (type KaVartoti)

那么,Go ir 中是否可以通过 channel 发送指针?

【问题讨论】:

【参考方案1】:

当然可以,例如

package main

type Data struct 
    i int


func func1(c chan *Data ) 
    for 
        var t *Data;
        t = <-c //receive
        t.i += 10 //increment
        c <- t   //send it back
    


func main() 
    c := make(chan *Data)
    t := Data10
    go func1(c)
    println(t.i)
    c <- &t //send a pointer to our t
    i := <-c //receive the result
    println(i.i)
    println(t.i)

见Go Playground。

您收到的错误告诉您,您的频道采用 KaVartoti 结构,您必须创建一个 KaVartoti 指针频道(chan *KaVartoti)。

猜测一下,您的duom 变量是一个数组/切片,因此如果您想发送指向其中一个元素的指针,您可以使用&amp;duom[i] 的第一种方法

【讨论】:

曾经应该小心,尽管在同一个通道上发送和接收,以相同的方法,尤其是在像这里这样的goroutine 中运行时,会使该通道成为 1 路进,1 路出路。 IOW,不要通过迭代并将多个值发送到通道来同时尝试此操作:您不会以相同的顺序取回这些值。但是,如果这是您的用例,通过阻塞每个接收,就像这里主要做的那样,就可以了。【参考方案2】:

检查以下示例:

package main

type weburl struct 
    url string

type responseweburl struct 
    contents, index string



var urlmap = make(map[string]weburl)
func callurl(ch chan *responseweburl, index, url string, wg *sync.WaitGroup) 
    defer wg.Done()
    response, err := http.Get(url)
    if err != nil 
        fmt.Printf("%s", err)
        os.Exit(1)
     else 
        defer response.Body.Close()
        contents, err := ioutil.ReadAll(response.Body)
        if err != nil 
            fmt.Printf("%s", err)
            os.Exit(1)
        
        var responsedata = responseweburlstring(contents), string(index)
        ch <- responsedata
    


func main()
    urlmap["google"] = weburl"http://www.google.com"
    urlmap["facebook"] = weburl"http://www.facebook.com"
    urlmap["linkedin"] = weburl"http://www.linkedin.com"
    ch := make(chan *responseweburl)
    for index, _ := range urlmap 
        fmt.Println("call url " + index)
        go callurl(ch, index, urlmap[index].url, wg)
    

【讨论】:

以上是关于在 Go Lang 中通过通道传递指针的主要内容,如果未能解决你的问题,请参考以下文章

带有指针值的 Go 通道在 for 循环中的行为不符合预期[重复]

如果通过 Golang 通道发送,结构是不是实际上在 goroutine 之间复制?

如何使用通道在 go 例程之间传递字节片

在 Service Fabric 中通过 HTTPS 调用 WCF:请求被中止:无法创建 SSL/TLS 安全通道

go——通道

Go36-10,11-通道