亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Go 中讀取一行數字

在 Go 中讀取一行數字

Go
心有法竹 2023-02-06 10:18:37
我有以下輸入,其中第一行是 N - 數字計數,第二行是 N 個數字,以空格分隔:5 2 1 0 3 4在 Python 中,我可以在不指定計數 (N) 的情況下讀取數字:_ = input() numbers = list(map(int, input().split()))我怎樣才能在 Go 中做同樣的事情?或者我必須確切地知道有多少個數字?
查看完整描述

2 回答

?
慕無忌1623718

TA貢獻1744條經驗 獲得超4個贊

您可以使用 bufio 逐行遍歷文件,并且該strings模塊可以將字符串拆分為 slice。所以這讓我們得到類似的東西:

package main


import (

    "bufio"

    "fmt"

    "os"

    "strconv"

    "strings"

)


func main() {

    readFile, err := os.Open("data.txt")

    defer readFile.Close()


    if err != nil {

        fmt.Println(err)

    }

    fileScanner := bufio.NewScanner(readFile)


    fileScanner.Split(bufio.ScanLines)


    for fileScanner.Scan() {


        // get next line from the file

        line := fileScanner.Text()


        // split it into a list of space-delimited tokens

        chars := strings.Split(line, " ")


        // create an slice of ints the same length as

        // the chars slice

        ints := make([]int, len(chars))


        for i, s := range chars {

            // convert string to int

            val, err := strconv.Atoi(s)

            if err != nil {

                panic(err)

            }


            // update the corresponding position in the

            // ints slice

            ints[i] = val

        }


        fmt.Printf("%v\n", ints)

    }

}

給定您的樣本數據將輸出:


[5]

[2 1 0 3 4]


查看完整回答
反對 回復 2023-02-06
?
守候你守候我

TA貢獻1802條經驗 獲得超10個贊

由于您知道定界符并且只有 2 行,因此這也是一個更緊湊的解決方案:


package main


import (

    "fmt"

    "os"

    "regexp"

    "strconv"

    "strings"

)


func main() {


    parts, err := readRaw("data.txt")

    if err != nil {

        panic(err)

    }


    n, nums, err := toNumbers(parts)

    if err != nil {

        panic(err)

    }


    fmt.Printf("%d: %v\n", n, nums)

}


// readRaw reads the file in input and returns the numbers inside as a slice of strings

func readRaw(fn string) ([]string, error) {

    b, err := os.ReadFile(fn)

    if err != nil {

        return nil, err

    }

    return regexp.MustCompile(`\s`).Split(strings.TrimSpace(string(b)), -1), nil

}


// toNumbers plays with the input string to return the data as a slice of int

func toNumbers(parts []string) (int, []int, error) {

    n, err := strconv.Atoi(parts[0])

    if err != nil {

        return 0, nil, err

    }

    nums := make([]int, 0)

    for _, p := range parts[1:] {

        num, err := strconv.Atoi(p)

        if err != nil {

            return n, nums, err

        }

        nums = append(nums, num)

    }


    return n, nums, nil

}

輸出是:


5: [2 1 0 3 4]


查看完整回答
反對 回復 2023-02-06
  • 2 回答
  • 0 關注
  • 184 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號