Заполнение динамического массива c консоли

Столкнулся с проблемой, что не могу ввести с консоли значения для двумерного массива. В GOlang я новичок, ранее писал на плюсах. Не могу понять в чём ошибка. Может кто подсказать ?

package main

import "fmt"

var BinTree [200000][3]int
    
func main() {
        var size int
        fmt.Scanf("%v", &size)
        for i := 0; i < size; i++ {
            fmt.Scanf("%v %v %v", &BinTree[i][0], &BinTree[i][1], &BinTree[i][2])
        }
        for i := 0; i < size; i++ {
            fmt.Printf("%v %v %v \n", BinTree[i][0], BinTree[i][1], BinTree[i][2])
        }
    }

Ввожу:

6
-2 0 2
8 4 3
9 0 0
3 5 6
0 0 0
6 0 0

Ответы (1 шт):

Автор решения: Pak Uula

Первое, что нужно освоить в Go - обработка ошибок. Это не С++, здесь исключения (почти) не выбрасывают.

Вместо fmt.Scanf("%v %v %v", &BinTree[i][0], &BinTree[i][1], &BinTree[i][2]) вам следовало написать что-то вроде

_, errr := fmt.Scanf("%v %v %v", &BinTree[i][0], &BinTree[i][1], &BinTree[i][2])
if err != nil {
    panic(err)
}

И тогда вы бы сразу увидели, что пошло не так:

panic: unexpected newline

Другими словами, конец строки fmt.Scanf обрабатывает особым образом. В строке ввода обязательно должен присутствовать символ \n, только в этом случае Scanf будет читать из следующей строки. Так же символ \n означает EOF. Вам достаточно читать как fmt.Scanf("%v\n", &size) и fmt.Scanf("%v %v %v\n", &BinTree[i][0], &BinTree[i][1], &BinTree[i][2])

Пример: https://go.dev/play/p/trhNHhYb_kx

Замечание к стилю. Вам не нужно аллоцировать массив BinTree. Функция append при необходимости аллоцирует достаточно памяти, чтобы нарастить этот массив на очередные три целых.

var BinTree [][]int

func main() {
    ...
    for i := 0; i < size; i++ {
        var v1, v2, v3 int
        _, err = fmt.Fscanf(reader, "%v %v %v\n", &v1, &v2, &v3)
        if err != nil {
            panic(err)
        }
        BinTree = append(BinTree, []int{v1, v2, v3})
    }
    ...
}

Полный пример: https://go.dev/play/p/BJnRiIxWijT

→ Ссылка