Ваш обновленный код было гораздо проще компилировать без номеров строк, но в нем отсутствовали операторы package и import.
Глядя на твой код, я заметил несколько вещей. Вот мой пересмотренный вариант вашего кода.
package main
import (
"bufio"
"fmt"
"io"
"os"
"strconv"
"strings"
"container/vector"
)
func main() {
n := scanf(os.Stdin)
fmt.Println()
fmt.Println(len(n), n)
}
func scanf(in io.Reader) []int {
var nums vector.IntVector
rd := bufio.NewReader(os.Stdin)
str, err := rd.ReadString('\n')
for err != os.EOF {
fields := strings.Fields(str)
for _, f := range fields {
if i, err := strconv.Atoi(f); err == nil {
nums.Push(i)
}
}
str, err = rd.ReadString('\n')
}
return nums
}
Я мог бы хотеть использовать любой входной файл для scanf()
, а не только Stdin
; scanf()
принимает io.Reader
в качестве параметра.
Вы писали: nums := new(vector.IntVector)
, где type IntVector []int
. Это выделяет целочисленную ссылку на срез с именем nums
и инициализирует ее нулем, затем функция new()
выделяет целочисленную ссылку на срез и инициализирует ее нулем, а затем назначает ее nums
. Я написал: var nums vector.IntVector
, что позволяет избежать избыточности, просто выделяя ссылку на целочисленный фрагмент с именем nums
и инициализируя ее нулем.
Вы не проверяли значение err
для strconv.Atoi()
, что означало, что неверный ввод был преобразован в нулевое значение; Я пропускаю это.
Чтобы скопировать из вектора в новый срез и вернуть срез, вы написали:
r := make([]int, nums.Len())
for i := 0; i < nums.Len(); i++ {
r[i] = nums.At(i)
}
return r
Сначала я просто заменил его на эквивалентный метод IntVector.Data()
: return nums.Data()
. Затем я воспользовался тем, что type IntVector []int
, и избежал выделения и копирования, заменив это на: return nums
.