在Go语言中通过通道传递指针

18

在Go语言中是否可以通过通道传递指针?我需要传递结构体,并对其进行更改,以便在传递结构体的同一函数中具有这些更改。

我已经尝试过

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中是否可以通过通道发送指针?

2个回答

23
当然可以,例如:
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 := Data{10}
    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变量是一个数组/切片,所以如果你想发送一个指向其中一个元素的指针,你可以使用第一种方法:&duom[i]


1
需要注意的是,特别是在像这样运行goroutine时,在同一方法中发送和接收相同通道会使该通道成为单向输入/输出通道。换句话说,不要尝试通过迭代和向通道发送多个值来并发执行此操作:您将无法按相同顺序获取这些值。但是,如果这是您的用例,则通过每次接收进行阻塞,就像主代码中所做的那样,是可以的。 - eduncan911

-3
检查以下示例:
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 = responseweburl{string(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)
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接