Why reading channel with pointers always returns same address/pointer?

Viewed 40

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
0 Answers
Related