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?
Go programming language allows you to pass a pointer to a function. To do so, simply declare the function parameter as a pointer type.
Are channels implicitly passed by reference in go ? Yes, the reference types in Go are slice , map and channel . When passing these, you're making a copy of the reference. (Strings are also implemented as a reference type, though they're immutable.)
Channels by default are pointers. Mostly, when you want to communicate with a goroutine, you pass the channel as an argument to the function or method. Hence when goroutine receives that channel as an argument, you don't need to dereference it to push or pull data from that channel.
Go channels are used for communicating between concurrently running functions by sending and receiving a specific element type's data. When we have numerous Goroutines running at the same time, channels are the most convenient way for them to communicate with one another.
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]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With