我试图将字符串中的整数列表扫描到数组中(或者是切片)
package main
import "fmt"
func main() {
var nums [5]int
n, _ := fmt.Sscan("1 2 3 4 5", &nums) // doesn't work
fmt.Println(nums)
}
我需要将Sscan
作为第二个参数传递给它才能使其正常工作?
我知道我可以通过nums[0], nums[1] ...
等,但我更喜欢一个论点。
答案 0 :(得分:6)
我认为这不是一个方便的单行。当Sscan
接受...interface{}
时,您还需要传递切片接口,因此首先转换数组:
func main() {
var nums [5]int
// Convert to interfaces
xnums := make([]interface{}, len(nums))
for n := range nums {
xnums[n] = &nums[n]
}
n, err := fmt.Sscan("1 2 3 4 5", xnums...)
if err != nil {
fmt.Printf("field %d: %s\n", n+1, err)
}
fmt.Println(nums)
}
http://play.golang.org/p/1X28J7JJwl
显然,您可以在界面数组中混合使用不同的类型,这样可以更轻松地扫描更复杂的字符串。对于简单的空间限制整数,最好使用strings.Split
或bufio.Scanner
以及strconv.Atoi
。
答案 1 :(得分:3)
为了使其能够处理不仅仅是硬编码的字符串,最好使用bufio.Scanner
和io.Reader
接口来执行此操作:
package main
import (
"bufio"
"fmt"
"io"
"strconv"
"strings"
)
func scanInts(r io.Reader) ([]int, error) {
s := bufio.NewScanner(r)
s.Split(bufio.ScanWords)
var ints []int
for s.Scan() {
i, err := strconv.Atoi(s.Text())
if err != nil {
return ints, err
}
ints = append(ints, i)
}
return ints, s.Err()
}
func main() {
input := "1 2 3 4 5"
ints, err := scanInts(strings.NewReader(input))
if err != nil {
fmt.Println(err)
}
fmt.Println(ints)
}
产地:
[1 2 3 4 5]
答案 2 :(得分:1)
除非您特意尝试使用Sscann,否则您也可以尝试使用此选项:
像这样:
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
nums := make([]int, 0)
for _, s := range strings.Split("1 2 3 4 5", " ") {
i, e := strconv.Atoi(s)
if e != nil {
i = 0 // that was not a number, default to 0
}
nums = append(nums, i)
}
fmt.Println(nums)
}