从os.Stdin中将数字读入数组或切片中 [英] Read numbers from os.Stdin into array or slice in Go

查看:99
本文介绍了从os.Stdin中将数字读入数组或切片中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

 数字:= make([] int,2)
fmt.Fscan(os.Stdin,& numbers [0],& numbers [1])$ ​​b $ b


$ b $我可以使用数字本身而不是分离的形状来简化它吗?

  numbers:= make([] int ,2)
fmt.Fscan(os.Stdin,& numbers)//只是一个例子,出错


解决方案

fmt 软件包不处理扫描切片,但您可以创建一个实用程序函数,其中包含所有元素的地址:

  func packAddrs(n [] int)[] interface {} {
p:= make([] interface {},len(n))
for i:= range n {
p [i] =& n [i]
}
返回p
}

使用此功能,您可以像这样扫描整片:

  numbers:= make([] int,2)
n,err:= fmt.Fscan(os.Stdin,packAddrs(numbers)...)
fmt.Println(numbers ,n,err)

使用 fmt.Sscan()

< pre $ numbers:= make([] int,5)
n,err:= fmt.Sscan(1 3 5 7 9,packAddrs(numbers)...)
fmt.Println(numbers,n,err)

输出(在< a href =https://play.golang.org/p/iwSo5PxH-fh =nofollow noreferrer> Go Playground ):

  [1 3 5 7 9] 5< nil> 


I can read multiple numbers using multiple variables like bellow.

numbers := make([]int, 2)
fmt.Fscan(os.Stdin, &numbers[0], &numbers[1])

Can I use numbers itself not as separated shape to make it simpler?

numbers := make([]int, 2)
fmt.Fscan(os.Stdin, &numbers) // just an example, got error

解决方案

The fmt package does not handle scanning slices, but you can create a utility function which packs the addresses of all the elements:

func packAddrs(n []int) []interface{} {
    p := make([]interface{}, len(n))
    for i := range n {
        p[i] = &n[i]
    }
    return p
}

And using this, you can scan a whole slice like this:

numbers := make([]int, 2)
n, err := fmt.Fscan(os.Stdin, packAddrs(numbers)...)
fmt.Println(numbers, n, err)

Testing it with fmt.Sscan():

numbers := make([]int, 5)
n, err := fmt.Sscan("1 3 5 7 9", packAddrs(numbers)...)
fmt.Println(numbers, n, err)

Output (try it on the Go Playground):

[1 3 5 7 9] 5 <nil>

这篇关于从os.Stdin中将数字读入数组或切片中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆