欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語言字符串及strings和strconv包使用實(shí)例

 更新時(shí)間:2024年06月11日 10:34:38   作者:栗箏i  
字符串是工作中最常用的,值得我們專門的練習(xí)一下,下面這篇文章主要給大家介紹了關(guān)于Go語言字符串及strings和strconv包使用的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

在 Go 語言編程中,字符串是最基本、最常用的數(shù)據(jù)類型之一。無論是處理用戶輸入、讀取文件內(nèi)容,還是生成輸出,字符串操作無處不在。為了方便開發(fā)者對(duì)字符串進(jìn)行各種操作,Go 語言提供了強(qiáng)大的 strings 包和 strconv 包。strings 包包含了一系列函數(shù),用于處理和操作字符串,如查找、替換、分割、拼接等。strconv 包則專注于字符串與其他基本數(shù)據(jù)類型之間的轉(zhuǎn)換,使得數(shù)據(jù)處理更加簡潔高效。在這篇文章中,我們將深入探討 Go 語言中的字符串處理方法,并詳細(xì)介紹 strings 包和 strconv 包的主要功能和用法,幫助您更好地掌握字符串操作技巧,提高編程效率。

1、Go 語言中的字符串

1.1、GO 語言

在 Go 語言中,字符串是 UTF-8 編碼字符的序列。對(duì)于 ASCII 字符,每個(gè)字符占用 1 個(gè)字節(jié),而其他字符根據(jù)需要占用 2 至 4 個(gè)字節(jié)。UTF-8 是一種廣泛使用的編碼格式,許多標(biāo)準(zhǔn)文本文件(如 XML 和 JSON)都采用這種編碼。由于 UTF-8 編碼的可變長度特性,Go 語言中的字符串也可能占用 1 到 4 個(gè)字節(jié),這與 C++、Java 或 Python 不同(例如,Java 始終使用 2 個(gè)字節(jié))。這種設(shè)計(jì)不僅減少了內(nèi)存和硬盤空間的占用,還免去了對(duì) UTF-8 文本進(jìn)行編碼和解碼的繁瑣操作。

字符串在 Go 中是一種值類型,且值不可變。這意味著一旦創(chuàng)建了字符串,就不能修改其內(nèi)容。更深入地講,字符串是字節(jié)的定長數(shù)組。

1.2、字符串字面值

Go 支持兩種形式的字符串字面值:

解釋字符串(Interpreted Strings):

  • 使用雙引號(hào)括起來。
  • 轉(zhuǎn)義字符會(huì)被替換,例如:\n 表示換行符,\t 表示制表符,\u 或 \U 表示 Unicode 字符,\\ 表示反斜杠本身。

示例:

var str = "Hello, World!\n"

非解釋字符串(Raw Strings):

  • 使用反引號(hào)括起來。
  • 支持多行字符串,轉(zhuǎn)義字符不會(huì)被替換,所有內(nèi)容都會(huì)原樣輸出。

示例:

var rawStr = `This is a raw string \n`

在 Go 中,字符串是通過長度來限定的,而不是像 C/C++ 那樣通過特殊字符 \0 結(jié)束。string 類型的零值是長度為零的字符串,即空字符串 ""。

1.3、字符串比較和操作

字符串可以通過常見的比較運(yùn)算符(==、!=、<、<=、>=、>)按字節(jié)在內(nèi)存中進(jìn)行比較。可以使用 len() 函數(shù)獲取字符串的字節(jié)長度:

len("hello") // 5

字符串的內(nèi)容(字節(jié))可以通過索引訪問,索引從 0 開始:

var str = "hello"
str[0] // 'h'
str[len(str)-1] // 'o'

需要注意的是,這種索引方式只對(duì)純 ASCII 字符串有效。對(duì)于 Unicode 字符,需要使用 unicode/utf8 包提供的方法。

1.4、字符串拼接

字符串可以使用 + 運(yùn)算符拼接:

var s1 = "hello"
var s2 = "world"
var s = s1 + " " + s2 // "hello world"

也可以使用 += 運(yùn)算符進(jìn)行拼接:

var s = "hello"
s += ", "
s += "world!" // "hello, world!"

在循環(huán)中使用 + 進(jìn)行字符串拼接并不是最高效的方法。更好的方法是使用 strings.Join() 函數(shù),或者使用 bytes.Buffer 進(jìn)行高效的字符串拼接。

1.5、字符串的其他操作

在 Go 語言中,可以將字符串視為字節(jié)(byte)的切片(slice),從而實(shí)現(xiàn)標(biāo)準(zhǔn)索引操作。使用 for 循環(huán)可以根據(jù)索引返回字符串中的字節(jié)。而使用 for-range 循環(huán)可以對(duì) Unicode 字符串進(jìn)行迭代操作。

此外,Go 語言提供了豐富的字符串操作函數(shù)和方法,可以在標(biāo)準(zhǔn)庫的 strings 和 unicode/utf8 包中找到。例如,可以使用 fmt.Sprint(x) 來格式化生成并返回字符串。

1.6、示例:統(tǒng)計(jì)字節(jié)和字符

創(chuàng)建一個(gè)程序用于統(tǒng)計(jì)字符串中的字節(jié)和字符數(shù)量。例如,分析字符串 "asSASA ddd dsjkdsjs dk" 和 "asSASA ddd dsjkdsjsこん dk",并解釋兩者不同的原因(提示:使用 unicode/utf8 包)。

示例代碼:

package main

import (
	"fmt"
	"unicode/utf8"
)

func main() {
	str1 := "asSASA ddd dsjkdsjs dk"
	str2 := "asSASA ddd dsjkdsjsこん dk"

	fmt.Printf("String: %s\n", str1)
	fmt.Printf("Bytes: %d, Runes: %d\n", len(str1), utf8.RuneCountInString(str1))

	fmt.Printf("String: %s\n", str2)
	fmt.Printf("Bytes: %d, Runes: %d\n", len(str2), utf8.RuneCountInString(str2))
}

該程序統(tǒng)計(jì)并輸出字符串的字節(jié)數(shù)和字符(rune)數(shù),從而展示 UTF-8 編碼在處理不同字符時(shí)的差異。

2、strings 和 strconv 包

在 Go 語言中,字符串作為一種基本數(shù)據(jù)結(jié)構(gòu),有許多預(yù)定義的處理函數(shù)。strings 包用于對(duì)字符串進(jìn)行主要操作,而 strconv 包用于字符串與其他類型之間的轉(zhuǎn)換。

2.1、strings 包

strings 包提供了豐富的字符串操作函數(shù),以下是一些常用操作:

2.1.1、前綴和后綴

  • strings.HasPrefix(s, prefix string) bool:判斷字符串 s 是否以 prefix 開頭。
  • strings.HasSuffix(s, suffix string) bool:判斷字符串 s 是否以 suffix 結(jié)尾。

示例:

package main

import (
	"fmt"
	"strings"
)

func main() {
	str := "This is an example of a string"
	fmt.Printf("T/F? Does the string \"%s\" have prefix %s? ", str, "Th")
	fmt.Printf("%t\n", strings.HasPrefix(str, "Th"))
}

輸出:

T/F? Does the string "This is an example of a string" have prefix Th? true

2.1.2、字符串包含關(guān)系

  • strings.Contains(s, substr string) bool:判斷字符串 s 是否包含子字符串 substr。

2.1.3、判斷子字符串或字符在父字符串中出現(xiàn)的位置(索引)

  • strings.Index(s, str string) int:返回子字符串 str 在字符串 s 中的第一個(gè)出現(xiàn)位置的索引,-1 表示不包含。
  • strings.LastIndex(s, str string) int:返回子字符串 str 在字符串 s 中最后一次出現(xiàn)位置的索引,-1 表示不包含。
  • strings.IndexRune(s string, r rune) int:返回字符 r 在字符串 s 中的索引。

示例:

package main

import (
	"fmt"
	"strings"
)

func main() {
	str := "Hi, I'm Marc, Hi."

	fmt.Printf("The position of \"Marc\" is: %d\n", strings.Index(str, "Marc"))
	fmt.Printf("The position of the first instance of \"Hi\" is: %d\n", strings.Index(str, "Hi"))
	fmt.Printf("The position of the last instance of \"Hi\" is: %d\n", strings.LastIndex(str, "Hi"))
	fmt.Printf("The position of \"Burger\" is: %d\n", strings.Index(str, "Burger"))
}

輸出:

The position of "Marc" is: 8
The position of the first instance of "Hi" is: 0
The position of the last instance of "Hi" is: 14
The position of "Burger" is: -1

2.1.4、字符串替換

  • strings.Replace(str, old, new string, n int) string:將字符串 str 中的前 n 個(gè)字符串 old 替換為字符串 new,并返回一個(gè)新的字符串。如果 n = -1,則替換所有字符串 old。

2.1.5、統(tǒng)計(jì)字符串出現(xiàn)次數(shù)

  • strings.Count(s, str string) int:計(jì)算字符串 str 在字符串 s 中出現(xiàn)的非重疊次數(shù)。

示例:

package main

import (
	"fmt"
	"strings"
)

func main() {
	str := "Hello, how is it going, Hugo?"
	manyG := "gggggggggg"

	fmt.Printf("Number of H's in %s is: %d\n", str, strings.Count(str, "H"))
	fmt.Printf("Number of double g's in %s is: %d\n", manyG, strings.Count(manyG, "gg"))
}

輸出:

Number of H's in Hello, how is it going, Hugo? is: 2
Number of double g’s in gggggggggg is: 5

2.1.6、重復(fù)字符串

  • strings.Repeat(s, count int) string:返回一個(gè)新的字符串,該字符串由 count 次重復(fù)字符串 s 組成。

示例:

package main

import (
	"fmt"
	"strings"
)

func main() {
	origS := "Hi there! "
	newS := strings.Repeat(origS, 3)
	fmt.Printf("The new repeated string is: %s\n", newS)
}

輸出:

The new repeated string is: Hi there! Hi there! Hi there!

2.1.7、修改字符串大小寫

  • strings.ToLower(s) string:將字符串 s 中的所有 Unicode 字符轉(zhuǎn)換為小寫。
  • strings.ToUpper(s) string:將字符串 s 中的所有 Unicode 字符轉(zhuǎn)換為大寫。

示例:

package main

import (
	"fmt"
	"strings"
)

func main() {
	orig := "Hey, how are you George?"
	fmt.Printf("The original string is: %s\n", orig)
	fmt.Printf("The lowercase string is: %s\n", strings.ToLower(orig))
	fmt.Printf("The uppercase string is: %s\n", strings.ToUpper(orig))
}

輸出:

The original string is: Hey, how are you George?
The lowercase string is: hey, how are you george?
The uppercase string is: HEY, HOW ARE YOU GEORGE?

2.1.8、修剪字符串

  • strings.TrimSpace(s):剔除字符串開頭和結(jié)尾的空白符號(hào)。
  • strings.Trim(s, cutset):剔除字符串開頭和結(jié)尾的指定字符 cutset。
  • strings.TrimLeft(s, cutset):剔除字符串開頭的指定字符 cutset。
  • strings.TrimRight(s, cutset):剔除字符串結(jié)尾的指定字符 cutset。

2.1.9、分割字符串

  • strings.Fields(s):根據(jù)空白符分割字符串,返回一個(gè)字符串切片。
  • strings.Split(s, sep):根據(jù)指定的分隔符 sep 分割字符串,返回一個(gè)字符串切片。

示例:

package main

import (
	"fmt"
	"strings"
)

func main() {
	str := "The quick brown fox jumps over the lazy dog"
	sl := strings.Fields(str)
	fmt.Printf("Splitted in slice: %v\n", sl)
	for _, val := range sl {
		fmt.Printf("%s - ", val)
	}
	fmt.Println()

	str2 := "GO1|The ABC of Go|25"
	sl2 := strings.Split(str2, "|")
	fmt.Printf("Splitted in slice: %v\n", sl2)
	for _, val := range sl2 {
		fmt.Printf("%s - ", val)
	}
	fmt.Println()

	str3 := strings.Join(sl2, ";")
	fmt.Printf("sl2 joined by ;: %s\n", str3)
}

輸出:

Splitted in slice: [The quick brown fox jumps over the lazy dog]
The - quick - brown - fox - jumps - over - the - lazy - dog -
Splitted in slice: [GO1 The ABC of Go 25]
GO1 - The ABC of Go - 25 -
sl2 joined by ;: GO1;The ABC of Go;25

2.1.10、拼接 slice 到字符串

  • strings.Join(sl []string, sep string) string:將元素類型為 string 的 slice 使用分割符 sep 拼接成一個(gè)字符串。

2.1.11、從字符串中讀取內(nèi)容

  • strings.NewReader(str):生成一個(gè) Reader 并讀取字符串中的內(nèi)容,然后返回指向該 Reader 的指針。

示例:

package main

import (
	"fmt"
	"strings"
)

func main() {
	str := "The quick brown fox jumps over the lazy dog"
	sl := strings.Fields(str)
	fmt.Printf("Splitted in slice: %v\n", sl)
	for _, val := range sl {
		fmt.Printf("%s - ", val)
	}
	fmt.Println()
	str2 := "GO1|The ABC of Go|25"
	sl2 := strings.Split(str2, "|")
	fmt.Printf("Splitted in slice: %v\n", sl2)
	for _, val := range sl2 {
		fmt.Printf("%s - ", val)
	}
	fmt.Println()
	str3 := strings.Join(sl2,";")
	fmt.Printf("sl2 joined by ;: %s\n", str3)
}

輸出:

Splitted in slice: [The quick brown fox jumps over the lazy dog]
The - quick - brown - fox - jumps - over - the - lazy - dog -
Splitted in slice: [GO1 The ABC of Go 25]
GO1 - The ABC of Go - 25 -
sl2 joined by ;: GO1;The ABC of Go;25

更多字符串操作的文檔請(qǐng)參閱官方文檔。

2.2、strconv 包

strconv 包用于字符串與其他基本數(shù)據(jù)類型之間的轉(zhuǎn)換。

2.2.1、將其他類型轉(zhuǎn)換為字符串

  • strconv.Itoa(i int) string:將整數(shù)轉(zhuǎn)換為字符串。
  • strconv.FormatFloat(f float64, fmt byte, prec int, bitSize int) string:將浮點(diǎn)數(shù)轉(zhuǎn)換為字符串,fmt 表示格式,prec 表示精度,bitSize 用于區(qū)分 float32 和 float64。

示例:

package main

import (
	"fmt"
	"strconv"
)

func main() {
	var i int =

 123
	var f float64 = 3.14159

	s1 := strconv.Itoa(i)
	s2 := strconv.FormatFloat(f, 'f', -1, 64)

	fmt.Printf("Integer to string: %s\n", s1)
	fmt.Printf("Float to string: %s\n", s2)
}

輸出:

Integer to string: 123
Float to string: 3.14159

2.2.2、將字符串轉(zhuǎn)換為其他類型

  • strconv.Atoi(s string) (int, error):將字符串轉(zhuǎn)換為整數(shù)。
  • strconv.ParseFloat(s string, bitSize int) (float64, error):將字符串轉(zhuǎn)換為浮點(diǎn)數(shù)。

示例:

package main

import (
	"fmt"
	"strconv"
)

func main() {
	var str string = "666"
	var anInt int
	var newStr string

	anInt, _ = strconv.Atoi(str)
	fmt.Printf("The integer is: %d\n", anInt)

	anInt += 5
	newStr = strconv.Itoa(anInt)
	fmt.Printf("The new string is: %s\n", newStr)
}

輸出:

The integer is: 666
The new string is: 671

strconv 包中還包含了一些輔助變量,如 strconv.IntSize,用于獲取當(dāng)前平臺(tái)下 int 類型的大小(位數(shù))。

通過 strings 和 strconv 包的強(qiáng)大功能,Go 語言提供了豐富的字符串處理和轉(zhuǎn)換工具,使得開發(fā)者能夠高效地處理和轉(zhuǎn)換字符串?dāng)?shù)據(jù)。

附:go語言中在數(shù)字中讀取小數(shù)點(diǎn)在數(shù)字字符串的哪一位

在 Go 語言中,可以使用 strconv 包中的 ParseFloat 函數(shù)將字符串轉(zhuǎn)換為數(shù)字,并讀取小數(shù)點(diǎn)在字符串的哪一位。具體的使用方法如下:

import "strconv"

str := "123.456789"
num, _ := strconv.ParseFloat(str, 64) // 將[字符串](https://geek.csdn.net/educolumn/ba94496e6cfa8630df5d047358ad9719?dp_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6NDQ0MDg2MiwiZXhwIjoxNzA3MzcxOTM4LCJpYXQiOjE3MDY3NjcxMzgsInVzZXJuYW1lIjoid2VpeGluXzY4NjQ1NjQ1In0.RrTYEnMNYPC7AQdoij4SBb0kKEgHoyvF-bZOG2eGQvc&amp;spm=1055.2569.3001.10083)轉(zhuǎn)換為 float64 類型的數(shù)字
dotIndex := strings.Index(strconv.FormatFloat(num, 'f', -1, 64), ".") // 讀取小數(shù)點(diǎn)在[字符串](https://geek.csdn.net/educolumn/ba94496e6cfa8630df5d047358ad9719?dp_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6NDQ0MDg2MiwiZXhwIjoxNzA3MzcxOTM4LCJpYXQiOjE3MDY3NjcxMzgsInVzZXJuYW1lIjoid2VpeGluXzY4NjQ1NjQ1In0.RrTYEnMNYPC7AQdoij4SBb0kKEgHoyvF-bZOG2eGQvc&amp;spm=1055.2569.3001.10083)中的位置

fmt.Println(dotIndex) // 輸出為 3

在 ParseFloat 函數(shù)中,第一個(gè)參數(shù)表示需要轉(zhuǎn)換為數(shù)字的字符串,第二個(gè)參數(shù)表示使用 float64 類型進(jìn)行轉(zhuǎn)換。在上面的例子中,我們將字符串轉(zhuǎn)換為數(shù)字后,使用 FormatFloat 函數(shù)讀取小數(shù)點(diǎn)在字符串中的位置。在 FormatFloat 函數(shù)中,'f' 表示格式化為浮點(diǎn)數(shù),-1 表示不限制小數(shù)位數(shù),64 表示使用 float64 類型的數(shù)字進(jìn)行格式化。然后使用 strings 包中的 Index 函數(shù)讀取小數(shù)點(diǎn)在字符串中的位置。

總結(jié)

到此這篇關(guān)于Go語言字符串及strings和strconv包使用的文章就介紹到這了,更多相關(guān)Go字符串strings和strconv包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang創(chuàng)建構(gòu)造函數(shù)的方法超詳細(xì)講解

    Golang創(chuàng)建構(gòu)造函數(shù)的方法超詳細(xì)講解

    構(gòu)造器一般面向?qū)ο笳Z言的典型特性,用于初始化變量。Go語言沒有任何具體構(gòu)造器,但我們能使用該特性去初始化變量。本文介紹不同類型構(gòu)造器的差異及其應(yīng)用場景
    2023-01-01
  • Go語言基礎(chǔ)學(xué)習(xí)之指針詳解

    Go語言基礎(chǔ)學(xué)習(xí)之指針詳解

    Go 語言中指針是很容易學(xué)習(xí)的,Go 語言中使用指針可以更簡單的執(zhí)行一些任務(wù)。所以本文就來和大家聊聊Go語言中指針的定義與使用,需要的可以參考一下
    2022-12-12
  • Go高級(jí)特性探究之優(yōu)先級(jí)隊(duì)列詳解

    Go高級(jí)特性探究之優(yōu)先級(jí)隊(duì)列詳解

    Heap?是一種數(shù)據(jù)結(jié)構(gòu),這種數(shù)據(jù)結(jié)構(gòu)常用于實(shí)現(xiàn)優(yōu)先隊(duì)列,這篇文章主要就是來和大家深入探討一下GO語言中的優(yōu)先級(jí)隊(duì)列,感興趣的可以了解一下
    2023-06-06
  • Go?跨域中間件解決CORS問題

    Go?跨域中間件解決CORS問題

    跨域問題CORS是前端開發(fā)人員經(jīng)常遇到的問題,本文主要介紹了Go?跨域中間件解決CORS問題,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-04-04
  • golang基于Mutex實(shí)現(xiàn)可重入鎖

    golang基于Mutex實(shí)現(xiàn)可重入鎖

    鎖可重入也就是當(dāng)前已經(jīng)獲取到鎖的goroutine繼續(xù)調(diào)用Lock方法獲取鎖,Go標(biāo)準(zhǔn)庫中提供了sync.Mutex實(shí)現(xiàn)了排他鎖,但并不是可重入的,所以本文給大家介紹了golang基于Mutex實(shí)現(xiàn)可重入鎖,文中有詳細(xì)的代碼示例,需要的朋友可以參考下
    2024-03-03
  • go語言中的udp協(xié)議及TCP通訊實(shí)現(xiàn)示例

    go語言中的udp協(xié)議及TCP通訊實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了go語言中的udp協(xié)議及TCP通訊的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Golang實(shí)現(xiàn)yaml配置文件的解析

    Golang實(shí)現(xiàn)yaml配置文件的解析

    這篇文章主要介紹了Golang實(shí)現(xiàn)yaml配置文件的解析,文中通過圖文結(jié)合的方式講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-12-12
  • Golang實(shí)現(xiàn)簡易的命令行功能

    Golang實(shí)現(xiàn)簡易的命令行功能

    這篇文章主要為大家詳細(xì)介紹了如何通過Golang實(shí)現(xiàn)一個(gè)簡易的命令行功能,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下
    2023-02-02
  • Go構(gòu)建高性能的事件管理器實(shí)例詳解

    Go構(gòu)建高性能的事件管理器實(shí)例詳解

    這篇文章主要為大家介紹了Go構(gòu)建高性能的事件管理器實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • GO web 數(shù)據(jù)庫預(yù)處理的實(shí)現(xiàn)

    GO web 數(shù)據(jù)庫預(yù)處理的實(shí)現(xiàn)

    本文主要介紹了GO web 數(shù)據(jù)庫預(yù)處理的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10

最新評(píng)論