最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

分享6個Go處理字符串的技巧小結(jié)

 更新時間:2019年12月08日 10:24:07   投稿:zx  
這篇文章主要介紹了分享6個Go處理字符串的技巧小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

如果你從 Ruby 或者 Python 轉(zhuǎn)型到 Go,將會有很多語言差異需要學(xué)習(xí),其中很多問題都是圍繞處理 string 類型。

下面是一些字符串的技巧,這些技巧解決了我在使用 Golang 的最初幾周中遇到的問題。

1. 多行字符串

在 Go 中創(chuàng)建多行字符串非常容易。只需要在你聲明或賦值時使用 (``) 。

str := `This is a
multiline
string.`

注意 - 任何你在字符串中的縮進(jìn)都將被保留在最終結(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 {
  // 模擬返回一個隨機(jī)字符串
  return "abc-123-"
}

如果你提前準(zhǔn)備好所有字符串,你也可以通過 strings.Join 的方式實(shí)現(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 {
  // 模擬返回一個隨機(jī)字符串
  return "abc-123-"
}

3. 將整型 (或任意數(shù)據(jù)類型) 轉(zhuǎn)為字符串

在大多數(shù)語言中,可輕易地將任意數(shù)據(jù)類型轉(zhuǎn)型為字符串進(jìn)行拼接,或用字符串插入(例如在 ruby 中這樣 "ID=#{id}")。很不幸,如果你嘗試在 Go 中去做這種顯示而易見的操作,比如強(qiáng)制將整形轉(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)保留在這樣的實(shí)例上,如正在創(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 不做任何類型檢查,因此在實(shí)際運(yùn)行代碼之前,您不太可能發(fā)現(xiàn)任何錯誤。

Sprintf 也比你通常在 strconv 包中使用的大多數(shù)函數(shù)慢,不過如果我說實(shí)話,速度差異是如此之小,一般不值得考慮。

4. 創(chuàng)建隨機(jī)字符串

這并不是一個真正的「快速技巧」,但我發(fā)現(xiàn)這是一個經(jīng)常被問到的問題。

如何在 Go 中創(chuàng)建隨機(jī)的字符串?

聽上去很簡單。許多語言,比如 Ruby 和 Python,都提供了一些幫助程序,使隨機(jī)字符串的生成變得非常簡單,所以 Go 肯定有這樣一個工具,對吧?答案是錯誤的。
Go 選擇只提供創(chuàng)建隨機(jī)字符串的工具,而將細(xì)節(jié)留給開發(fā)人員。雖然一開始可能會有些困難,但好處是您可以完全決定如何生成字符串。 這意味著您可以指定字符集、如何播種隨機(jī)生成以及任何其他詳細(xì)信息。簡而言之,你有更多的控制權(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í)場上多次運(yùn)行這段代碼,您可能會注意到它總是輸出相同的字符串 - aJFLa7XPH5。

這是因?yàn)?Go 練習(xí)場總是使用相同的時間,所以當(dāng)我們用 rand.NewSource 方法時。在當(dāng)前時間內(nèi)傳遞的那個值總是相同的,所以我們生成的字符串總是相同的。

對于您的特定需求,可能有比這個更優(yōu)的解決方案,但這是一個很好的起點(diǎn)。如果您正在尋找改進(jìn) / 更改代碼的方法,您可能會考慮使用 crypto/rand 包來生成隨機(jī)數(shù)據(jù) — 這通常更安全,但最終可能需要更多的工作。

無論您最終使用的是什么,這個示例都應(yīng)該有助于您入門。 對于大多數(shù)不涉及密碼和身份驗(yàn)證系統(tǒng)等敏感數(shù)據(jù)的實(shí)際用例,它工作得足夠好。 只是一定要記得你的種子隨機(jī)數(shù)發(fā)生器!這可以通過 rand.Seed 函數(shù)在 math/rand 包中完成,或者創(chuàng)建一個源代碼。在上面的例子中,我選擇創(chuàng)建一個源代碼。

5. strings 包、HasPrefix 和自定義代碼

在處理字符串時,想要知道一個字符串是以一個特定的字符串開始還是以一個特定的字符串結(jié)束是非常常見的情況。例如,如果您的 API 鍵都以 sk_ 開頭,那么您可能希望驗(yàn)證 API 請求中提供的所有 API 鍵都以這個前綴開頭,否則進(jìn)行數(shù)據(jù)庫查找將浪費(fèi)大量時間。

對于那些聽起來像是非常常見的用例的函數(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)驗(yàn)正在學(xué)習(xí) Go 語言,一個常見的錯誤是開發(fā)者花太多時間尋找能夠提供所需功能的包,而他們自己可輕易地編碼實(shí)現(xiàn)這功能。

使用標(biāo)準(zhǔn)庫肯定有好處(如它們經(jīng)過了徹底的測試并有很好的文檔記錄)。盡管有這些好處,但如果你發(fā)現(xiàn)自己花了超過幾分鐘的時間來尋找一個函數(shù),那么自己編寫它通常也是有益的。在這種情況下,根據(jù)需求自定義(編碼),將很快完成,你將完全了解正在發(fā)生的事情,不會被奇怪的邊界情況(譯者注如索引越界)措手不及。您也不必?fù)?dān)心其他人維護(hù)代碼。

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)
}

以上就是 Go 語言字符串使用過程中的一些小技巧,希望能幫到你。如果你需要更多 Go 相關(guān)的實(shí)踐,可以查閱我發(fā)表的其他相關(guān)教程。

原文地址:https://www.calhoun.io/6-tips-for-using-strings-in-go/

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解Golang并發(fā)操作中常見的死鎖情形

    詳解Golang并發(fā)操作中常見的死鎖情形

    在Go的協(xié)程里面死鎖通常就是永久阻塞了,本文主要介紹了Golang并發(fā)操作中常見的死鎖情形,具有一定的參考價值,感興趣的可以了解一下
    2021-09-09
  • 詳解Go語言如何解析帶注釋的json

    詳解Go語言如何解析帶注釋的json

    標(biāo)準(zhǔn)的json格式是不帶注釋,但是有時候?yàn)榱朔奖憷斫鈐son中各字段的含義,需要支持帶注釋的json,這篇文章主要介紹了Go語言解析帶注釋json的相關(guān)方法,希望對大家有所幫助
    2024-03-03
  • golang常用庫之配置文件解析庫-viper使用詳解

    golang常用庫之配置文件解析庫-viper使用詳解

    viper 配置管理解析庫,是由大神 Steve Francia 開發(fā),他在google領(lǐng)導(dǎo)著 golang 的產(chǎn)品開發(fā),他也是 gohugo.io 的創(chuàng)始人之一,命令行解析庫 cobra 開發(fā)者,這篇文章主要介紹了golang常用庫之配置文件解析庫-viper使用詳解,需要的朋友可以參考下
    2020-10-10
  • go語言K8S?的?informer機(jī)制淺析

    go語言K8S?的?informer機(jī)制淺析

    這篇文章為大家主要介紹了go語言K8S?的?informer機(jī)制淺析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 一文詳解golang延時任務(wù)的實(shí)現(xiàn)

    一文詳解golang延時任務(wù)的實(shí)現(xiàn)

    這篇文章主要為大家介紹了golang延時任務(wù)的實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Golang使用CopyIn進(jìn)行批量創(chuàng)建的示例代碼

    Golang使用CopyIn進(jìn)行批量創(chuàng)建的示例代碼

    本文主要介紹了Golang使用CopyIn進(jìn)行批量創(chuàng)建的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • go程序中同一個包下為什么會存在多個同名的函數(shù)或變量(詳細(xì)解析)

    go程序中同一個包下為什么會存在多個同名的函數(shù)或變量(詳細(xì)解析)

    這篇文章主要介紹了go程序中同一個包下為什么會存在多個同名的函數(shù)或變量(詳細(xì)解析),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-05-05
  • Go語言實(shí)現(xiàn)猜數(shù)字小游戲

    Go語言實(shí)現(xiàn)猜數(shù)字小游戲

    這篇文章主要為大家詳細(xì)介紹了Go語言實(shí)現(xiàn)猜數(shù)字小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • go 讀取BMP文件頭二進(jìn)制讀取方式

    go 讀取BMP文件頭二進(jìn)制讀取方式

    這篇文章主要介紹了go 讀取BMP文件頭二進(jìn)制讀取方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • golang 之 wire 庫的使用小結(jié)

    golang 之 wire 庫的使用小結(jié)

    Wire是一個用于Go語言的編譯時依賴注入庫,通過代碼生成提高性能和可維護(hù)性,它支持編譯時依賴注入、類型安全、簡單易用等功能,文章通過代碼示例展示了如何使用Wire進(jìn)行依賴注入,并探討了其優(yōu)點(diǎn)如解耦、可測試和維護(hù)性,感興趣的朋友跟隨小編一起看看吧
    2025-03-03

最新評論

黄山市| 雅江县| 汶川县| 邵东县| 乌拉特前旗| 涟水县| 钦州市| 婺源县| 陆丰市| 句容市| 同心县| 西宁市| 平泉县| 安新县| 汽车| 阳江市| 镇原县| 濉溪县| 娱乐| 通江县| 元氏县| 东阿县| 蒙自县| 文化| 浮山县| 鹤壁市| 庐江县| 名山县| 黔西| 汪清县| 五寨县| 肇源县| 东阳市| 大庆市| 兴文县| 梁平县| 文山县| 威信县| 中方县| 仙桃市| 二连浩特市|