Passing pointer through channel in Go Lang

25,453

Sure you can, e.g.

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)
}

See in Go Playground.

The error you get tells you that your channel takes a KaVartoti struct, you'll have to create a channel of KaVartoti pointers (a chan *KaVartoti).

At a guess, your duom variable is an array/slice, so if you want to send a pointer to one of the elements, you'd use your first approach of &duom[i]

Share:
25,453

Related videos on Youtube

Eddwhis
Author by

Eddwhis

Java, Android

Updated on July 09, 2022

Comments

  • Eddwhis
    Eddwhis almost 2 years

    It is possible to pass pointer over channel in go lang? I need to pass struct, do changes in it and have theese changes in the same function from where struct was passed?

    I tried

    chan <- &data
    

    and I got

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

    after this I tried

    chan <- *data
    

    and I got

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

    So, it is possible to send pointer through channel in Go ir not?

  • eduncan911
    eduncan911 about 8 years
    Once should be cautious though that sending and receiving on the same channel, in the same method especially when running in a goroutine like here, makes that channel a 1 way in, 1 way out channel. IOW, do not try this concurrently by iterating and sending multiple values to the channel: you won't get back those values in the same order. But, by blocking on each receive, like done in here in the main, would be ok if that is your use case.