2017-09-10 51 views
2

我正在嘗試編寫一個Go腳本,該腳本需要用戶希望的許多逗號分隔座標行,將座標字符串拆分並轉換爲float64 ,將每行存儲爲一個分片,然後將每個分片附加到一個分片中以備後用。Golang - 將控制檯的字符串輸入片段轉換爲數字片段

例輸入爲:

1.1,2.2,3.3 
3.14,0,5.16 

示例輸出:

[[1.1 2.2 3.3],[3.14 0 5.16]] 

Python中的等效是

def get_input(): 
    print("Please enter comma separated coordinates:") 
    lines = [] 
    while True: 
     line = input() 
     if line: 
      line = [float(x) for x in line.replace(" ", "").split(",")] 
      lines.append(line) 
     else: 
      break 
    return lines 

但我在圍棋中寫道似乎太長了(粘貼下面),並且我創建了很多變量,但沒有像在Python中那樣更改變量類型的功能。因爲我從字面上開始寫Golang來學習它,所以我擔心我的腳本很長,因爲我試圖將Python思維轉換爲Go。因此,我想問一些關於如何在Go風格中編寫更短,更簡潔的腳本的建議?謝謝。

package main 

import (
    "fmt" 
    "os" 
    "bufio" 
    "strings" 
    "strconv" 
) 

func main() { 
    inputs := get_input() 
    fmt.Println(inputs) 
} 

func get_input() [][]float64 { 
    fmt.Println("Please enter comma separated coordinates: ") 

    var inputs [][]float64 

    scanner := bufio.NewScanner(os.Stdin) 
    for scanner.Scan() { 
     if len(scanner.Text()) > 0 { 
      raw_input := strings.Replace(scanner.Text(), " ", "", -1) 
      input := strings.Split(raw_input, ",") 
      converted_input := str2float(input) 
      inputs = append(inputs, converted_input) 
     } else { 
      break 
     } 
    } 

    return inputs 
} 

func str2float(records []string) []float64 { 

    var float_slice []float64 

    for _, v := range records { 
     if s, err := strconv.ParseFloat(v, 64); err == nil { 
      float_slice = append(float_slice, s) 
     } 
    } 

    return float_slice 
} 
+0

看起來不錯。 Golang可能比普通C的冗長,但是對於簡潔的代碼來說幾乎沒有什麼比Python好......順便說一句,它應該更長一點:你應該在for循環之後檢查scanner.Err()。 –

+0

@StephaneMartin,非常感謝您的評論。我剛剛檢查了掃描儀上的Golang文檔。你的意思是'if err = scanner.Err();應該添加err!= nil ...'來檢測任何錯誤? – Nahua

+0

是的,在for循環返回後,檢查掃描器是否可以真正解析內容 –

回答

2

只使用字符串函數:

package main 

import (
    "bufio" 
    "fmt" 
    "os" 
    "strconv" 
    "strings" 
) 

func main() { 
    scanner := bufio.NewScanner(os.Stdin) 
    var result [][]float64 
    var txt string 
    for scanner.Scan() { 
     txt = scanner.Text() 
     if len(txt) > 0 { 
      values := strings.Split(txt, ",") 
      var row []float64 
      for _, v := range values { 
       fl, err := strconv.ParseFloat(strings.Trim(v, " "), 64) 
       if err != nil { 
        panic(fmt.Sprintf("Incorrect value for float64 '%v'", v)) 
       } 
       row = append(row, fl) 
      } 
      result = append(result, row) 
     } 
    } 
    fmt.Printf("Result: %v\n", result) 
} 

運行:

$ printf "1.1,2.2,3.3 
3.14,0,5.16 
2,45,76.0, 45 , 69" | go run experiment2.go 

Result: [[1.1 2.2 3.3] [3.14 0 5.16] [2 45 76 45 69]] 
+0

嗨尤金,感謝您分享您的解決方案!真的很喜歡你的想法,在命令行中寫入所有的輸入數據:) – Nahua

1

隨着給定的輸入,你可以將它們連接起來,使一個JSON字符串,然後反編組(反序列化)認爲:

func main() { 
    var lines []string 
    for { 
     var line string 
     fmt.Scanln(&line) 
     if line == "" { 
      break 
     } 
     lines = append(lines, "["+line+"]") 
    } 
    all := "[" + strings.Join(lines, ",") + "]" 
    inputs := [][]float64{} 
    if err := json.Unmarshal([]byte(all), &inputs); err != nil { 
     fmt.Println(err) 
     return 
    } 

    fmt.Println(inputs) 
} 
+0

謝謝Kaveh。我從來沒有使用過JSON,並會研究它! – Nahua

相關問題