首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Go语言中通过通道传递指针

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

Stack Overflow用户
提问于 2013-12-31 05:56:43
回答 2查看 24.1K关注 0票数 17

在go lang中是否可以在通道上传递指针?我需要传递struct,在其中进行更改,并在传递struct的相同函数中进行这些更改?

我试过了

代码语言:javascript
复制
chan <- &data

我得到了

代码语言:javascript
复制
# command-line-arguments .\o.go:130: cannot use &duom[i] (type *KaVartoti) as type KaVartoti in send

在这之后我试过了

代码语言:javascript
复制
chan <- *data

我得到了

代码语言:javascript
复制
# command-line-arguments .\o.go:130: invalid indirect of duom[i] (type KaVartoti)

所以,在Go ir中通过通道发送指针是可能的,不是吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-31 06:18:09

你当然可以,例如:

代码语言:javascript
复制
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]的第一种方法

票数 22
EN

Stack Overflow用户

发布于 2018-08-01 21:41:41

检查以下示例:

代码语言:javascript
复制
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)
    }
}
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20848236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档