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

我需要将字符串扫描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 main


import "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正确解析此字符串的正确格式是什么?


拉莫斯之舞
浏览 93回答 1
1回答

慕妹3242003

您正在使用正则表达式来捕获输入,同时使用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}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go