Спецификация языка программирования Go
После вызова close и после получения любых ранее отправленных значений, Операции приема возвращают нулевое значение для типа канала без блокировки. Многозначная операция приема возвращает полученное значение вместе с указанием того, закрыт ли канал.
blockquote>Вы считаете нулевые значения.
Например,
package main import ( "fmt" ) func main() { c1 := make(chan interface{}) close(c1) c2 := make(chan interface{}) close(c2) var c1Count, c2Count int var z1Count, z2Count int for i := 1000; i >= 0; i-- { select { case z1 := <-c1: c1Count++ if z1 == nil { z1Count++ } case z2 := <-c2: c2Count++ if z2 == nil { z2Count++ } } } fmt.Printf("c1Count: %d\nc2Count: %d\n", c1Count, c2Count) fmt.Printf("z1Count: %d\nz2Count: %d\n", z1Count, z2Count) }
Детская площадка: https://play.golang.org/p/tPRkqXrAFno
Вывод:
c1Count: 511 c2Count: 490 z1Count: 511 z2Count: 490
Спецификация языка программирования Go
blockquote>Для операторов с диапазон range
Для каналов получаемые значения итерации являются последовательными значениями, посылаемыми в канале до тех пор, пока канал не будет закрыт. Если канал ноль, выражение диапазона блокируется навсегда.
blockquote>Close полезен для оператора for с предложением range.
Диспетчер задач показывает Вам объем памяти, принадлежащий приложению, которое, оказывается, разбито на страницы в реальную память в то время. При уменьшении приложения в Windows ядро автоматически обрезает рабочий набор процесса, таким образом, требуется меньше памяти. Это поведение не характерно для приложений.NET.
При рассмотрении вместо этого процесса "Частные Байты" значение это даст Вам лучший признак объема памяти, используемого процессом. Это значение не изменится, когда рабочий набор процесса будет обрезан.
Microsoft предлагает больше информации в этой статье базы знаний: http://support.microsoft.com/kb/293215