Arrays 如何在Go中将整型字符串转换为数组?
我在任何地方都找不到这个(或者我就是不明白)。我正在从一个以空格分隔的文件中读取数字列表。也就是说,该文件看起来像“1 4 0 0 2 5…等”,我希望它是一个数组的形式(或者,最好是一个二维数组,其中每个新行也分开)。我该怎么做呢 这是我到目前为止所拥有的代码——很多代码都是从我找到的教程中获取的,所以我并不完全理解所有代码。它可以很好地读入文件,并返回一个字符串。 附带问题:当我打印字符串时,我在输出的末尾得到:%!(额外) 有人知道如何解决这个问题吗?我假设它将最后一个nil字符放在返回字符串中,但我不知道如何解决这个问题Arrays 如何在Go中将整型字符串转换为数组?,arrays,go,Arrays,Go,我在任何地方都找不到这个(或者我就是不明白)。我正在从一个以空格分隔的文件中读取数字列表。也就是说,该文件看起来像“1 4 0 0 2 5…等”,我希望它是一个数组的形式(或者,最好是一个二维数组,其中每个新行也分开)。我该怎么做呢 这是我到目前为止所拥有的代码——很多代码都是从我找到的教程中获取的,所以我并不完全理解所有代码。它可以很好地读入文件,并返回一个字符串。 附带问题:当我打印字符串时,我在输出的末尾得到:%!(额外) 有人知道如何解决这个问题吗?我假设它将最后一个nil字符放在返回字
package main
import (
"fmt"
"os"
)
func read_file(filename string) (string, os.Error) {
f, err := os.Open(filename)
if err != nil {
return "", err
}
defer f.Close() // f.Close will run when we're finished.
var result []byte
buf := make([]byte, 100)
for {
n, err := f.Read(buf[0:])
result = append(result, buf[0:n]...) // append is discussed later.
if err != nil {
if err == os.EOF {
break
}
return "", err // f will be closed if we return here.
}
}
return string(result), nil // f will be closed if we return here.
}
func print_board() {
}
func main() {
fmt.Printf(read_file("sudoku1.txt")) // this outputs the file exactly,
// but with %!(EXTRA <nil>) at the end.
// I do not know why exactly
}
主程序包
进口(
“fmt”
“操作系统”
)
func read_文件(文件名字符串)(字符串,os.Error){
f、 错误:=os.Open(文件名)
如果错误!=零{
返回“”,错误
}
延迟f.Close()//f.Close将在完成后运行。
var结果[]字节
buf:=make([]字节,100)
为了{
n、 错误:=f.Read(buf[0:])
result=append(result,buf[0:n]…)//后面将讨论append。
如果错误!=零{
如果err==os.EOF{
打破
}
返回“”,如果我们返回此处,错误//f将关闭。
}
}
返回字符串(result),如果我们返回这里,nil//f将被关闭。
}
func打印板(){
}
func main(){
fmt.Printf(read_file(“sudoku1.txt”)//这会准确地输出文件,
//但最后加了%!(额外)。
//我不知道确切的原因
}
非常感谢您能提供的任何帮助
-W您可以使用strings包将字符串转换为二维整数数组。解释这里使用的一些语言结构有点超出了这个问题的范围,但请随时要求澄清任何问题
// read_file also returns an error!
s, err := read_file("sudoku1.txt")
if err != nil {
panic(err.String())
}
// split into rows at newlines
rows := strings.Split(s, "\n")
board := make([][]int, len(rows))
for i, row := range rows {
// extract all whitespace separated fields
elems := strings.Fields(row)
board[i] = make([]int, len(elems))
for j, elem := range elems {
var err os.Error
// convert each element to an integer
board[i][j], err = strconv.Atoi(elem)
if err != nil {
panic(err.String())
}
}
}
fmt.Println(board)
之所以使用%(!EXTRA)
,是因为read\u文件返回两个值,第二个值是一个错误(在本例中为零)。Printf尝试将第二个值与字符串中的插槽匹配。由于字符串不包含任何格式槽(%v,%d,%s…),Printf确定它是一个额外的参数,并在输出中这样说
请注意,包ioutil已经提供了ReadFile函数,它将为您提供一个[]字节而不是字符串,但在其他方面与您的read_文件功能相同。非常感谢,这非常有帮助。我对这门语言的理解好多了。