Почему переменная будет пустой после присвоения значений переменной в процедурах go? - PullRequest
0 голосов
/ 31 января 2019

Я использую подпрограммы go для быстрого выполнения.Я делаю пример программы для практики, но мне интересно, когда я вижу, что значение переменной пустое после назначения в подпрограммах go.Я показываю свой код: -

package main

import (
    "fmt"
)

func main() {
    var collectInt []int
    doneChan := make(chan string)
    go func() {
        for i := 0; i < 10; i++ {
            collectInt = append(collectInt, i)
        }

    }()
    fmt.Println(collectInt)
    go func() {
        doneChan <- "done"
    }()
    <-doneChan
}

Воспроизвести ссылку https://play.golang.org/p/VgwrzR8GBzN

Пожалуйста, скажите мне, как я буду присваивать значение переменной при использовании процедур go.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Я могу объяснить, что на самом деле сделал ваш код, шаг за шагом:

  1. Делавэр и Маллок для среза collectInt, он пуст.
  2. fmt.Println ()пустой ломтик.
  3. случайным образом выполняет две процедуры.Первая процедура может завершиться с ошибкой, потому что как только вторая программа запускается первой, основная процедура останавливается.

хорошо, вы можете знать, почему на шаге 2 выведите пустой фрагмент

0 голосов
/ 31 января 2019

Правило состоит не в том, чтобы обмениваться данными с общими переменными, а в том, чтобы передавать данные между процедурами go с каналами.

См. Притчи Go

Не делайтеt общаются, разделяя память, разделяют память, общаясь.

Либо создайте collectInt канал и передавайте каждый int отдельно:

package main

import (
    "fmt"
)

func main() {
    collectInt := make(chan int)
    go func() {
        for i := 0; i < 10; i++ {
            collectInt <- i
        }
        close(collectInt)
    }()
    for i := range collectInt {
        fmt.Println(i)
    }
}

Или передавайте весь набор данныхс каналом:

package main

import (
    "fmt"
)

func main() {
    collectInt := make(chan []int)
    go func() {
        var ints []int
        for i := 0; i < 10; i++ {
            ints = append(ints, i)
        }
        collectInt <- ints
    }()
    fmt.Println(<-collectInt)
}

doneChan в этом случае не используется.

...