如何使用扫描值填充切片

时间:2018-06-16 00:43:23

标签: go

我是Go的新手,并且无法让fmt.scan()填充切片。输入值的数量是动态的,我不能使用for循环。我最初的想法是尝试这个:

package main

import "fmt"

func main() {
    var x []int
    fmt.Println("Enter input")
    fmt.Scanf("%v", append(x))
    fmt.Println(x)
}

这显然不起作用。有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:1)

  

[获取] fmt.Scan()来填充切片。输入值的数量是动态的,我不能使用for循环。

也许,这样的事情:

package main

import "fmt"

func input(x []int, err error) []int {
    if err != nil {
        return x
    }
    var d int
    n, err := fmt.Scanf("%d", &d)
    if n == 1 {
        x = append(x, d)
    }
    return input(x, err)
}

func main() {
    fmt.Println("Enter input:")
    x := input([]int{}, nil)
    fmt.Println("Input:", x)
}

输出:

Enter input:
 1
2 3
4
 5  6  7

Input: [1 2 3 4 5 6 7]

附录:

当为变量分配存储或创建新值并且未提供显式初始化时,变量或值的类型为the zero value,默认值为nil,用于切片。 ConversionsT(x)形式的表达式,其中T是一种类型,x是可以转换为T类型的表达式。 []int(nil)是切片值[]int的零值转换。

x := input([]int(nil), nil)

相当于

x := input([]int{}, nil)

var x []int
x = input(x, nil)

我修改了我的使用答案:

x := input([]int{}, nil)

答案 1 :(得分:0)

使用简单的程序包和更多的逻辑,您可以尝试一下,

package main

import "fmt"

func main() {
    var ele rune
    var size int
    var sli = make([]int,0,1)
    size = cap(sli)
    for i:=0; i<=size; i++{
        if i>=len(sli){
            size=size+1
        }
        ele = 0
        fmt.Println("Enter a number to add: ")
        fmt.Scan(&ele)
        if ele==0 {
            fmt.Println("Stopping!")
            break
        }
        sli = append(sli, int(ele))
    }
    fmt.Println(sli)
}

当您输入除整数以外的任何代码时,代码将停止并打印切片。