如何在Go中将一串int转换为数组?

时间:2011-11-23 18:02:00

标签: arrays go

我无法在任何地方找到它(或者我只是不理解它)。我正在读取由空格分隔的文件中的数字列表。即该文件看起来像“1 4 0 0 2 5 ...等”,我希望它以数组的形式(或者,最好是一个二维数组,其中每个新行也是分开的)。我该怎么做呢?

这是我到目前为止的代码 - 其中很多都来自我发现的教程,所以我并不完全理解它。它读入文件很好,并返回一个字符串。 附带问题:当我打印字符串时,我在输出结束时得到这个:%!(EXTRA) 有谁知道如何解决这个问题?我假设它将最后一个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
}

非常感谢您提供的任何帮助。

-W

1 个答案:

答案 0 :(得分:5)

您可以使用strings包将字符串转换为2维的int数组。解释这里使用的一些语言结构有点超出了这个问题的范围,但可以随意要求澄清任何内容。

// 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 <nil>)的原因是read_file返回两个值,第二个是错误(在这种情况下为nil)。 Printf尝试将第二个值与字符串中的插槽匹配。由于该字符串不包含任何格式化插槽(%v,%d,%s ...),因此Printf确定它是 extra 参数,并在输出中说明。

请注意,包ioutil已经提供了一个ReadFile函数,它将为您提供一个[]字节而不是字符串,但在函数上与read_file相同。