During test writing I discovered (I am new to go) that behaviour of channel with pointers and objects are different.
If I have channel with objects, every read I get next object.
However if i have channel with pointers, every read I get same address.
Why? And how I supposed to work with channel with pointers of I want to operate on objects in channel, without creating their copies?
Example (and on playground ):
package main
import "fmt"
func main() {
arr := []int{1, 2, 3, 4, 5}
int_channel := make(chan int, 5)
pointer_channel := make(chan *int, 5)
// Fill channels
for _, d := range arr {
pointer_channel <- &d
int_channel <- d
}
fmt.Printf("Channels filled. Unread values: %v %v \n", len(int_channel), len(pointer_channel))
fmt.Println("Read values from int_channel")
for _, val := range arr {
d := <-int_channel
fmt.Printf("Read value from channel: %v (expected: %v) ", d, val)
fmt.Printf("Unread values in int_channel: %v\n", len(int_channel))
}
fmt.Println("Read values from pointer_channel")
for _, val := range arr {
d := <-pointer_channel
fmt.Printf("Read value from channel: %v (expected: %v) ", d, val)
fmt.Printf("Unread values in pointer_channel: %v\n", len(pointer_channel))
}
}
Output:
Channels filled. Unread values: 5 5
Read values from int_channel
Read value from channel: 1 (expected: 1) Unread values in int_channel: 4
Read value from channel: 2 (expected: 2) Unread values in int_channel: 3
Read value from channel: 3 (expected: 3) Unread values in int_channel: 2
Read value from channel: 4 (expected: 4) Unread values in int_channel: 1
Read value from channel: 5 (expected: 5) Unread values in int_channel: 0
Read values from pointer_channel
Read value from channel: 0xc00001c030 (expected: 1) Unread values in pointer_channel: 4
Read value from channel: 0xc00001c030 (expected: 2) Unread values in pointer_channel: 3
Read value from channel: 0xc00001c030 (expected: 3) Unread values in pointer_channel: 2
Read value from channel: 0xc00001c030 (expected: 4) Unread values in pointer_channel: 1
Read value from channel: 0xc00001c030 (expected: 5) Unread values in pointer_channel: 0