为了账号安全,请及时绑定邮箱和手机立即绑定

在golang中扫描以“:”分隔的字符串

在golang中扫描以“:”分隔的字符串

Go
拉莫斯之舞 2023-02-14 17:43:25
我需要将字符串扫描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

}


查看完整回答
反对 回复 2023-02-14
  • 1 回答
  • 0 关注
  • 92 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信