В чем разница между `var a chan int` и` a: = make (chan int) `? - PullRequest
0 голосов
/ 29 января 2019

Сегодня я изучаю каналы и программу го.И я столкнулся с некоторым явлением, которое меня смущает.

Мой файл go выглядит следующим образом:

package main

import (
    "fmt"
)

func testRoutine(number int, channel chan int) {
    channel <- number
}


func main() {
//    var a chan int
    a := make(chan int)
    b := make(chan int)
    go testRoutine(1, a)
    go testRoutine(2, b)

    c, d := <-a, <-b
    fmt.Printf("%d %d\n", c, d)
}

, он хорошо работает, когда я использую синтаксис a := make(chan int).

Но когдаЯ изменил a := make(chan int) на var a chan int, получил отчет о панике:

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive (nil chan)]:
main.main()
    /Users/marioluisgarcia/Local/practice/go/cache/var_make_diff.go:19 +0xc7

goroutine 18 [chan send (nil chan)]:
main.testRoutine(0x1, 0x0)
    /Users/marioluisgarcia/Local/practice/go/cache/var_make_diff.go:8 +0x3f
created by main.main
    /Users/marioluisgarcia/Local/practice/go/cache/var_make_diff.go:16 +0x7c

goroutine 19 [chan send]:
main.testRoutine(0x2, 0xc42008a060)
    /Users/marioluisgarcia/Local/practice/go/cache/var_make_diff.go:8 +0x3f
created by main.main
    /Users/marioluisgarcia/Local/practice/go/cache/var_make_diff.go:17 +0xa7

Итак, есть ли разница между var a chan int и a := make(chan int) и почему это явление паники было вызвано?

Ответы [ 3 ]

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

a := make(chan int) создает небуферизованный канал.Этот канал с нулевым буфером.Вы можете отправлять данные через него.

var a chan int создает переменную канала и устанавливает для нее значение по умолчанию, равное nil .А канал nil всегда блокируется, поэтому ваша программа заблокирована.Вы не можете отправлять данные по nil каналу.

Если вы распечатаете значения, вы увидите разницу.

package main

import (
    "fmt"
)

func main() {
    var i chan int
    fmt.Println(i)
    a := make(chan int)
    fmt.Println(a)
}

Перейти на игровую площадку: https://play.golang.org/p/Bxr6qRfNqZd

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

var x chan int является только объявлением для 'x', вы только создаете val в стеке без фактической памяти malloc в heap.however,

var x chan int
x = make(chan int, 0)

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

Кстати, в golang нечетко распределяется некий вал, встроенный в стек, или куча.Для таких ссылочных типов, как map, slice, chan type, все они должны make() перед использованием, или это приведет к панике из-за ошибки nil point

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

Напомним, что var name type создает переменную с именем name типа type, для которой установлено значение по умолчанию для этого типа.Это означает, что var a chan int создает канал, такой что a == nil.

var a chan int = make(chan int) и a := make(chan int), однако, одинаковы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...