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

Pointers 在Go-Lang中通过通道传递指针,pointers,go,channel,lang,Pointers,Go,Channel,Lang,是否可以在go lang中通过通道传递指针?我需要传递struct,对它进行更改,并在传递struct的同一个函数中进行更改 我试过了 chan <- &data 在这之后,我试着 chan <- *data 所以,可以通过Go ir not中的通道发送指针?当然可以,例如 package main type Data struct { i int } func func1(c chan *Data ) { for { var t *D

是否可以在go lang中通过通道传递指针?我需要传递struct,对它进行更改,并在传递struct的同一个函数中进行更改

我试过了

chan <- &data
在这之后,我试着

chan <- *data
所以,可以通过Go ir not中的通道发送指针?

当然可以,例如

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)
}
主程序包
类型数据结构{
i int
}
func func1(c chan*数据){
为了{
var t*数据;

t=检查以下示例:

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)
    }
}
主程序包
类型weburl结构{
url字符串
}
类型responseweburl结构{
目录,索引字符串
}
var urlmap=make(map[string]weburl)
func callerl(ch chan*responseweburl,索引,url字符串,wg*sync.WaitGroup){
推迟工作组完成()
响应,错误:=http.Get(url)
如果错误!=零{
fmt.Printf(“%s”,错误)
操作系统退出(1)
}否则{
延迟响应。Body.Close()
contents,err:=ioutil.ReadAll(response.Body)
如果错误!=零{
fmt.Printf(“%s”,错误)
操作系统退出(1)
}
var responsedata=responseweburl{string(contents),string(index)}

ch Once应该谨慎,尽管在同一通道上以相同的方法发送和接收,特别是在像这里这样的
goroutine
中运行时,会使该通道成为单向输入,单向输出通道。注意,不要通过迭代和向通道发送多个值来同时尝试此操作:您不会在同一个通道中返回这些值但是,如果这是您的用例,那么通过在每次接收时阻塞,就像在这里主要完成的那样,就可以了。
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)
}
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)
    }
}