首頁 > 後端開發 > Golang > Fscanf 並像 C 中那樣省略字段

Fscanf 並像 C 中那樣省略字段

WBOY
發布: 2024-02-12 16:18:05
轉載
1174 人瀏覽過

Fscanf 并像 C 中那样省略字段

問題內容

是否可以像 C 中省略欄位 %*s

var pid int
fmt.Fscanf(r, "%*s %d", &pid)
登入後複製

解決方法

實際上,在 Go 中你無法做到這一點(至少在 Go 1.21.0 上)。

原始碼表明:

  • 格式字串中沒有省略欄位的動詞(如C 語言中的%*s):實際上,字串的動詞總是單一字元 (% s%v%q%X%X)
  • Fscanf 方法迭代參數a 中的Fscanf 陣列(r io.Reader ,格式字串,a ...any))。因此,您必須a 中定義一個參數,即使您不關心它的值

如果您不想定義變量,可以使用:

var pid int
fmt.Fscanf(r, "%s %d", new(string), &pid)
登入後複製

其他替代方案

對於您的具體情況,要解析閱讀器中的某些內容,您可以先將閱讀器讀入字串(例如 io.ReadAll):

CB835C294C06824721603abd255bd78a

接著使用 strings.Split 方法或正規表示式,例如:

  1. strings.Split
pidString := strings.Split(string(s), " ")[1]
pid, err := strconv.Atoi(pidString)
if err != nil {
    panic(err) // handle the error
}
登入後複製
  • 使用正規表示式:
  • re := regexp.MustCompile(`[^\s]+ (?P<pid>\d+)`) // similar to "%s %d"
    matches := re.FindStringSubmatch(s)
    pidString := matches[re.SubexpIndex("pid")]
    pid, err := strconv.Atoi(pidString)
    if err != nil {
        panic(err) // handle the error
    }
    
    登入後複製

    可能還有其他方法,但這些應該足以說明。希望有幫助。

    以上是Fscanf 並像 C 中那樣省略字段的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    來源:stackoverflow.com
    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
    熱門教學
    更多>
    最新下載
    更多>
    網站特效
    網站源碼
    網站素材
    前端模板