我正在嘗試編寫一個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
}
看起來不錯。 Golang可能比普通C的冗長,但是對於簡潔的代碼來說幾乎沒有什麼比Python好......順便說一句,它應該更長一點:你應該在for循環之後檢查scanner.Err()。 –
@StephaneMartin,非常感謝您的評論。我剛剛檢查了掃描儀上的Golang文檔。你的意思是'if err = scanner.Err();應該添加err!= nil ...'來檢測任何錯誤? – Nahua
是的,在for循環返回後,檢查掃描器是否可以真正解析內容 –