亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在防止“切片邊界超出范圍”錯誤的同時輕松地在 Go 中獲取子字符串?

如何在防止“切片邊界超出范圍”錯誤的同時輕松地在 Go 中獲取子字符串?

Go
qq_遁去的一_1 2021-12-07 10:49:08
使用 Go,我想將長字符串截斷為任意長度(例如用于日志記錄)。const maxLen = 100func main() {    myString := "This string might be longer, so we'll keep all except the first 100 bytes."    fmt.Println(myString[:10])      // Prints the first 10 bytes    fmt.Println(myString[:maxLen])  // panic: runtime error: slice bounds out of range}現在,我可以用一個額外的變量和if語句來解決它,但這似乎很冗長:const maxLen = 100func main() {    myString := "This string might be longer, so we'll keep all except the first 100 bytes."    limit := len(myString)    if limit > maxLen {        limit = maxLen    }    fmt.Println(myString[:limit]) // Prints the first 100 bytes, or the whole string if shorter}有沒有更短/更清潔的方法?
查看完整描述

2 回答

?
慕村9548890

TA貢獻1884條經驗 獲得超4個贊

使用一個簡單的函數來隱藏實現細節。例如,


package main


import "fmt"


func maxString(s string, max int) string {

    if len(s) > max {

        r := 0

        for i := range s {

            r++

            if r > max {

                return s[:i]

            }

        }

    }

    return s

}


func main() {

    s := "日本語"

    fmt.Println(s)

    fmt.Println(maxString(s, 2))

}

輸出:


日本語

日本


查看完整回答
反對 回復 2021-12-07
?
汪汪一只貓

TA貢獻1898條經驗 獲得超8個贊

假設您想保留最多的maxLen字符,即您的代碼所說的內容,而不是您的字符串所說的內容。


如果你不需要原來的 myString,你可以像這樣覆蓋它:


const maxLen = 100


func main() {

    myString := "This string might be longer, so we'll keep the first 100 bytes."


    if len(myString) >= maxLen {

        myString = myString[:maxLen] // slicing is a constant time operation in go

    }


    fmt.Println(myString) // Prints the first 100 bytes, or the whole string if shorter

}

這可能會將 unicode 字符減半,最后留下一些垃圾。如果您需要處理多字節 unicode(您可能會這樣做),請嘗試以下操作:


func main() {

    myString := "日本語"


    mid := maxLen

    for len(myString) >= mid && utf8.ValidString(myString[:mid]) == false {

        mid++ // add another byte from myString until we have a whole multi-byte character

    }

    if len(myString) > mid {

        myString = myString[:mid]

    }


    fmt.Println(myString) // Prints the first 100 bytes, or the whole string if shorter

}

或者,如果您可以接受從輸出中刪除最多一個字符,則此版本會更簡潔一些


func main() {

    myString := "日本語"


    for len(myString) >= maxLen || utf8.ValidString(myString) == false {

        myString = myString[:len(myString)-1] // remove a byte

    }


    fmt.Println(myString) // Prints the first 100 bytes, or the whole string if shorter

}


查看完整回答
反對 回復 2021-12-07
  • 2 回答
  • 0 關注
  • 246 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號