本篇文章為大家展示了如何在golang中處理字符串,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
1. 多行字符串
在 Go 中創(chuàng)建多行字符串非常容易。只需要在你聲明或賦值時使用 (``) 。
str := `This is a multiline string.`
注意 - 任何你在字符串中的縮進都將被保留在最終結(jié)果。
str := `This string will have tabs in it`
2. 高效的字符串連接方式
Go 允許你通過 "+" 的方式連接字符串,但這種方式在處理大量字符串連接的場景下將非常低效。使用 bytes.Buffer 連接字符串是一個更高效的方式,它會一次性將所有的內(nèi)容連接起來轉(zhuǎn)化成字符串。
package main import ( "bytes" "fmt" ) func main() { var b bytes.Buffer for i := 0; i < 1000; i++ { b.WriteString(randString()) } fmt.Println(b.String()) } func randString() string { // 模擬返回一個隨機字符串 return "abc-123-" }
如果你提前準(zhǔn)備好所有字符串,你也可以通過 strings.Join 的方式實現(xiàn)。
package main import ( "fmt" "strings" ) func main() { var strs []string for i := 0; i < 1000; i++ { strs = append(strs, randString()) } fmt.Println(strings.Join(strs, "")) } func randString() string { // 模擬返回一個隨機字符串 return "abc-123-" }
3. 將整型 (或任意數(shù)據(jù)類型) 轉(zhuǎn)為字符串
在大多數(shù)語言中,可輕易地將任意數(shù)據(jù)類型轉(zhuǎn)型為字符串進行拼接,或用字符串插入(例如在 ruby 中這樣 "ID=#{id}")。很不幸,如果你嘗試在 Go 中去做這種顯示而易見的操作,比如強制將整形轉(zhuǎn)為字符串,你不會得到期望的結(jié)果。
i := 123 s := string(i)
你希望 s 的輸出是多少?如果你像大多數(shù)人一樣猜測 "123",那你就大錯特錯了。相反,你會得到類似 "E" 的值。這根本不是我們想要的!
相反,您應(yīng)該使用像 [strconv] (https://golang.org/pkg/strconv/) 這樣的包或像 fmt.Sprintf 這樣的函數(shù)。例如,下面是一個使用 strconv.Itoa 將整數(shù)轉(zhuǎn)換為字符串的示例。
package main import ( "fmt" "strconv" ) func main() { i := 123 t := strconv.Itoa(i) fmt.Println(t) }
你還可以使用 fmt.Sprintf 函數(shù)將幾乎所有數(shù)據(jù)類型轉(zhuǎn)換為字符串,但通常應(yīng)保留在這樣的實例上,如正在創(chuàng)建的字符串包含嵌入數(shù)據(jù),而非在期望將單個整數(shù)轉(zhuǎn)換為字符串時用。
package main import "fmt" func main() { i := 123 t := fmt.Sprintf("We are currently processing ticket number %d.", i) fmt.Println(t) }
Sprintf 的操作與 fmt.Printf 幾乎相同,只是它沒有將結(jié)果字符串輸出到標(biāo)準(zhǔn)輸出,而是將其作為字符串返回。
限制使用 Sprintf
如前所述,fmt.Sprintf 通常應(yīng)用在創(chuàng)建具有嵌入值的字符串。這有幾個原因,但最突出的一個原因是 fmt.Sprintf 不做任何類型檢查,因此在實際運行代碼之前,您不太可能發(fā)現(xiàn)任何錯誤。
Sprintf 也比你通常在 strconv 包中使用的大多數(shù)函數(shù)慢,不過如果我說實話,速度差異是如此之小,一般不值得考慮。
4. 創(chuàng)建隨機字符串
這并不是一個真正的「快速技巧」,但我發(fā)現(xiàn)這是一個經(jīng)常被問到的問題。
如何在 Go 中創(chuàng)建隨機的字符串?
聽上去很簡單。許多語言,比如 Ruby 和 Python,都提供了一些幫助程序,使隨機字符串的生成變得非常簡單,所以 Go 肯定有這樣一個工具,對吧?答案是錯誤的。
Go 選擇只提供創(chuàng)建隨機字符串的工具,而將細節(jié)留給開發(fā)人員。雖然一開始可能會有些困難,但好處是您可以完全決定如何生成字符串。 這意味著您可以指定字符集、如何播種隨機生成以及任何其他詳細信息。簡而言之,你有更多的控制權(quán),但代價是需要寫一些額外的代碼。
下面是一個使用 math/rand 包和一組字母數(shù)字字符作為字符集的快速示例。
package main import ( "fmt" "math/rand" "time" ) func main() { fmt.Println(RandString(10)) } var source = rand.NewSource(time.Now().UnixNano()) const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" func RandString(length int) string { b := make([]byte, length) for i := range b { b[i] = charset[source.Int63()%int64(len(charset))] } return string(b) }
Go 練習(xí)場總是輸出相同的字符串
如果您在 Go 練習(xí)場上多次運行這段代碼,您可能會注意到它總是輸出相同的字符串 - aJFLa7XPH5。
這是因為 Go 練習(xí)場總是使用相同的時間,所以當(dāng)我們用 rand.NewSource 方法時。在當(dāng)前時間內(nèi)傳遞的那個值總是相同的,所以我們生成的字符串總是相同的。
對于您的特定需求,可能有比這個更優(yōu)的解決方案,但這是一個很好的起點。如果您正在尋找改進 / 更改代碼的方法,您可能會考慮使用 crypto/rand 包來生成隨機數(shù)據(jù) — 這通常更安全,但最終可能需要更多的工作。
無論您最終使用的是什么,這個示例都應(yīng)該有助于您入門。 對于大多數(shù)不涉及密碼和身份驗證系統(tǒng)等敏感數(shù)據(jù)的實際用例,它工作得足夠好。 只是一定要記得你的種子隨機數(shù)發(fā)生器!這可以通過 rand.Seed 函數(shù)在 math/rand 包中完成,或者創(chuàng)建一個源代碼。在上面的例子中,我選擇創(chuàng)建一個源代碼。
5. strings 包、HasPrefix 和自定義代碼
在處理字符串時,想要知道一個字符串是以一個特定的字符串開始還是以一個特定的字符串結(jié)束是非常常見的情況。例如,如果您的 API 鍵都以 sk_ 開頭,那么您可能希望驗證 API 請求中提供的所有 API 鍵都以這個前綴開頭,否則進行數(shù)據(jù)庫查找將浪費大量時間。
對于那些聽起來像是非常常見的用例的函數(shù),您最好的選擇通常是直接訪問 strings 包并檢查一些可能對您有幫助的內(nèi)容。在這種情況下,你會想要使用功能HasPrefix(str, prefix) 和strings.HasSuffix(str, prefix) 。 你可以在下面看到他們的用法。
package main import ( "fmt" "strings" ) func main() { fmt.Println(strings.HasPrefix("something", "some")) fmt.Println(strings.HasSuffix("something", "thing")) }
雖然 strings 包中有大量有用的公共函數(shù),但值得注意的是,并不總是值得去尋找一個能滿足您需要的包。如果你有其他語言經(jīng)驗正在學(xué)習(xí) Go 語言,一個常見的錯誤是開發(fā)者花太多時間尋找能夠提供所需功能的包,而他們自己可輕易地編碼實現(xiàn)這功能。
使用標(biāo)準(zhǔn)庫肯定有好處(如它們經(jīng)過了徹底的測試并有很好的文檔記錄)。盡管有這些好處,但如果你發(fā)現(xiàn)自己花了超過幾分鐘的時間來尋找一個函數(shù),那么自己編寫它通常也是有益的。在這種情況下,根據(jù)需求自定義(編碼),將很快完成,你將完全了解正在發(fā)生的事情,不會被奇怪的邊界情況(譯者注如索引越界)措手不及。您也不必擔(dān)心其他人維護代碼。
6. 字符串可以被轉(zhuǎn)換成 byte 切片 (反之亦然)
Go 語言可以將一個字符串轉(zhuǎn)換成 byte 切片 ([]byte) ,也可以將 byte 切片轉(zhuǎn)換成字符串。轉(zhuǎn)換的過程跟其他任意類型轉(zhuǎn)換的方式一樣簡單。這種轉(zhuǎn)換方式通常用于為一個接收 byte 切片參數(shù)的函數(shù)傳遞一個字符串 以及 為一個接收字符串參數(shù)的函數(shù)傳遞 byte 切片的場景。
下面是一個轉(zhuǎn)換的例子:
package main import "fmt" func main() { var s string = "this is a string" fmt.Println(s) var b []byte b = []byte(s) fmt.Println(b) for i := range b { fmt.Println(string(b[i])) } s = string(b) fmt.Println(s) }
golang可以做服務(wù)器端開發(fā),但golang很適合做日志處理、數(shù)據(jù)打包、虛擬機處理、數(shù)據(jù)庫代理等工作。在網(wǎng)絡(luò)編程方面,它還廣泛應(yīng)用于web應(yīng)用、API應(yīng)用等領(lǐng)域。
上述內(nèi)容就是如何在golang中處理字符串,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計公司行業(yè)資訊頻道。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
本文標(biāo)題:如何在golang中處理字符串-創(chuàng)新互聯(lián)
網(wǎng)頁地址:http://www.yijiale78.com/article30/hhdso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、移動網(wǎng)站建設(shè)、App開發(fā)、Google、外貿(mào)網(wǎng)站建設(shè)、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容