我需要將字符串掃描23.584950:58.353603:an address, str:a place, name 成:type Origin struct { Lat float64 `json:"lat" binding:"required"` Lng float64 `json:"lng" binding:"required"` Address string `json:"address" binding:"required"` Name string `json:"name" binding:"required"`}我的代碼:package mainimport "fmt"type Origin struct { Lat float64 `json:"lat" binding:"required"` Lng float64 `json:"lng" binding:"required"` Address string `json:"address" binding:"required"` Name string `json:"name" binding:"required"`}func (o *Origin) ParseString(str string) error { if str == "" { return nil } _, err := fmt.Sscanf(str, "%f:%f:%[^:]:%[^/n]", &o.Lat, &o.Lng, &o.Address, &o.Name) if err != nil { return fmt.Errorf("parsing origin: %s, input:%s", err.Error(), str) } return nil}func main() { o := &Origin{} o.ParseString("23.584950:58.353603:address, text:place, name, text") fmt.Println(o)}https://go.dev/play/p/uUTNyx2cDFB但是,structo打印出:&{23.58495 58.353603 }。地址和姓名未正確掃描。Sscanf正確解析此字符串的正確格式是什么?
1 回答

慕妹3242003
TA貢獻1824條經驗 獲得超6個贊
您正在使用正則表達式來捕獲輸入,同時使用fmt.Scanff. fmt.Scanff不支持正則表達式。如果要使用正則表達式,請使用regexp包。
或者你可以使用一個簡單的strings.Split并將輸入解析為正確的類型:
func (o *Origin) ParseString2(str string) error {
if str == "" {
return nil
}
parts := strings.Split(str, ":")
if len(parts) != 4 {
return errors.New("expected format '...:...:...:...")
}
f, err := strconv.ParseFloat(parts[0], 64)
if err != nil {
return err
}
o.Lat = f
f, err = strconv.ParseFloat(parts[1], 64)
if err != nil {
return err
}
o.Lng = f
o.Address = parts[2]
o.Name = parts[3]
return nil
}
- 1 回答
- 0 關注
- 110 瀏覽
添加回答
舉報
0/150
提交
取消