我需要将字符串扫描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 关注
- 92 浏览
添加回答
举报
0/150
提交
取消