Как перебрать канал и назначить его ссылкой - PullRequest
0 голосов
/ 02 октября 2018

Кажется, что при назначении вывода канала массиву указателей всегда будет назначаться последний, отправленный на канал string2.Кто-нибудь может объяснить это поведение?

package main

import (
    "fmt"
)

type myType struct {
    myString string
}

func main() {
    queue := make(chan myType, 2)
    queue <- myType{myString: "string1"}
    queue <- myType{myString: "string2"}
    close(queue)

    var types []*myType

    for element := range queue {
        types = append(types, &element)
    }

    for _, element := range types {
        fmt.Println(element.myString)
    }
}

приводит к:

result2
result2

1 Ответ

0 голосов
/ 02 октября 2018

Это не имеет ничего общего с каналами.Проверьте этот код, который имеет тот же результат:

package main

import (
    "fmt"
)

type myType struct {
    myString string
}

func main() {
    in := [2]myType{
        myType{myString: "string1"},
        myType{myString: "string2"},
    }

    var types []*myType

    for _, element := range in {
        types = append(types, &element)
    }

    for _, element := range types {
        fmt.Println(element.myString)
    }
}

Воспроизвести

Проблема в том, что вы берете указатель на element, переменную, которая будетПолучайте новое значение каждый раз через цикл, , но сама переменная остается той же , поэтому все указатели, которые вы добавляете к точке среза, к одному и тому же значению.Чтобы это исправить, добавьте значения вместо указателей или создайте временной цикл в вашем цикле и вместо этого нажмите указатель на временное

var types []myType

for element := range queue {
    types = append(types, element)
}

или

var types []*myType

for element := range queue {
    tmp := element
    types = append(types, &tmp)
}
...