Go-字符和字符串類型詳解(原始字符串、拼接、修改、比較、拆分、查找等)更多Go相關內容:Go-Golang學習總結筆記

目錄html

上篇文章思考題前端

字符型git

字符串型golang

內存後端

原始字符串數組

返回子串安全

拼接ide

修改函數

遍歷ui

strings包

比較

大小寫轉換

去先後綴

判斷先後綴

拆分與拼接

子串

包含

統計

查找

替換

unicode包

是不是十進制數字

是不是數字字符

是不是字母

是不是小寫字母

是不是大寫字母

返回對應的大寫字母

返回對應的小寫字母

所有代碼

截圖

參考

思考題


上篇文章思考題

Go-數字與布爾類型詳解

結果:cannot use number2 + 10 (type int) as type int64 in assignment

注意:uint8就是byte,編譯經過,可是int和int64須要顯示轉換

字符型

沒有,推薦使用byte或rune,僅包含Ascii碼時,使用byte,其他使用rune。

字母一個字節,漢字3個字節

存儲過程:字符->碼值(數字)->二進制->保存

直接輸出爲數字,按字符使用 %c

a := 'a'
	fmt.Printf("a的類型%T,a的值:%v,a對應的字符:%c,a的大小:%d\n",a,a,a,unsafe.Sizeof(a))
	you := '你'
	fmt.Printf("you的類型%T,you的值:%v,you對應的字符:%c,you的大小:%d\n",you,you,you,unsafe.Sizeof(you))
字符串型

src->builtin->builtin.go

// string is the set of all strings of 8-bit bytes, conventionally but not
// necessarily representing UTF-8-encoded text. A string may be empty, but
// not nil. Values of string type are immutable.
type string string

由byte組成,是byte數組,不能夠變,直接輸出能夠

str1 := "hello"
	str2 := "你好"
	fmt.Println("str1 str2:",str1,str2)

內存

src->reflect->value.go

// StringHeader is the runtime representation of a string.
// It cannot be used safely or portably and its representation may
// change in a later release.
// Moreover, the Data field is not sufficient to guarantee the data
// it references will not be garbage collected, so programs must keep
// a separate, correctly typed pointer to the underlying data.
type StringHeader struct {
	Data uintptr
	Len  int
}

目前,在go 1.16.3中是使用指針和長度的結構體表示,之後可能會修改。

world := "world"
	world1 := "世界"
	fmt.Printf("world:%v world1:%v world:%T,world1:%T\n", world,world1,world,world1)
	fmt.Println("&world[0] &world1 len(world) len(world1):",&world,&world1,len(world),len(world1))
	// &world[0] 不容許取地址

你能夠訪問world[0],可是不能訪問world[0]的地址 &world[0],出於安全考慮。

原始字符串

雙引號"識別轉義字符,反引號`原生形式輸出

str3 := "我要換行\n換好啦:)\n"
	str4 := `我想換行\n換不了:(\n`

返回子串

相似Python的切片,沒有步長,左閉右開,左右相等時爲空,左默認爲0,右默認爲字符串長度

fmt.Println("world[:3] world1[3:]:",world[:3],world1[3:])

拼接

使用+,放不下時,+保留在上一行

str5 := str1+world+
		str2+world1

修改

使用切片

tmp := []byte(world)
	tmp[0] = 'W'
	world = string(tmp)
	fmt.Println("world &world",world,&world)

注意:地址相同,確實是修改了

遍歷

for或for range

for i:=0;i<len(world1);i=i+3{
		fmt.Print(world1[i:i+3])
	}
	for _,s := range world1{
		fmt.Printf("%c",s)
	}

注意:中文是3個取一次,不然沒意義。推薦使用for range方式,有字符和中文時均可以。

strings包

比較

==

注意:嚴格區分大小寫

EqualFold

func EqualFold(s, t string) bool

判斷兩個utf-8編碼字符串(將unicode大寫、小寫、標題三種格式字符視爲相同)是否相同。

alpha := "abc"
	alpha2 := "Abc"
	fmt.Println("alpha==alpha2 strings.EqualFold(alpha,alpha2):", alpha==alpha2,strings.EqualFold(alpha,alpha2))

大小寫轉換

func ToLower(s string) string

返回將全部字母都轉爲對應的小寫版本的拷貝

func ToUpper(s string) string

返回將全部字母都轉爲對應的大寫版本的拷貝

fmt.Println("",strings.ToUpper(alpha),strings.ToLower(alpha2))

去先後綴

func TrimSpace(s string) string

返回將s先後端全部空白(unicode.IsSpace指定)都去掉的字符串。

func Trim(s string, cutset string) string

返回將s先後端全部cutset包含的utf-8碼值都去掉的字符串。

func TrimLeft(s string, cutset string) string

返回將s前端全部cutset包含的utf-8碼值都去掉的字符串。

func TrimRight(s string, cutset string) string

返回將s後端全部cutset包含的utf-8碼值都去掉的字符串。

song := "  \n\t兩隻\t老虎\t愛跳舞\n   "
	fmt.Println("去空格 去空格和兩隻 去空格和兩 去空格和跳舞:",strings.TrimSpace(song),strings.Trim(song," \n\t兩隻"),
		strings.TrimLeft(song," \n\t兩"),strings.TrimRight(song," \n兩跳舞"))

注意:TrimSpace將\t等也算爲Space,指定時是字符集,在其中就算,直到左/右側不在集合中中止。

判斷先後綴

func HasPrefix(s, prefix string) bool

判斷s是否有前綴字符串prefix。

func HasSuffix(s, suffix string) bool

 判斷s是否有後綴字符串suffix。

fmt.Println("song[4:]有兩隻前綴嗎? song有愛跳舞后綴嗎?",strings.HasPrefix(song[4:],"兩隻"),strings.HasSuffix(song,"愛跳舞"))

拆分與拼接

func Split(s, sep string) []string

用去掉s中出現的sep的方式進行分割,會分割到結尾,並返回生成的全部片斷組成的切片(每個sep都會進行一次切割,即便兩個sep相鄰,也會進行兩次切割)。若是sep爲空字符,Split會將s切分紅每個unicode碼值一個字符串。

func Join(a []string, sep string) string

 將一系列字符串鏈接爲一個字符串,之間用sep來分隔。

ip := "192.168.31.129"
	slice  := strings.Split(ip,".")
	newIp := strings.Join(slice,"?")

子串

包含

func Contains(s, substr string) bool

判斷字符串s是否包含子串substr。

fmt.Println("song包含老虎嗎? ",strings.Contains(song,"老虎"))

統計

func Count(s, sep string) int

返回字符串s中有幾個不重複的sep子串。

fmt.Println("ip中有幾個.? ",strings.Count(ip,"."))

查找

func Index(s, sep string) int

 子串sep在字符串s中第一次出現的位置,不存在則返回-1。

func LastIndex(s, sep string) int

子串sep在字符串s中最後一次出現的位置,不存在則返回-1。

fmt.Println("ip中第一個1的下標 ip中最後一個1的下標:",strings.Index(ip,"1"),strings.LastIndex(ip,"1"))

替換

func Replace(s, old, new string, n int) string

返回將s中前n個不重疊old子串都替換爲new的新字符串,若是n<0會替換全部old子串。

fmt.Println("將ip中的.替換爲*",strings.Replace(ip,".","*",-1))

類型轉換函數Atoi等在數據轉換文章,更多方法,查看參考的包

bytes包和strings包的函數差很少,只不過參數由string變爲了[]byte,能夠看下參考的Go標準庫,這裏就不展現了。

查看源代碼也常常能看到官方的騷操做,好比bytes.Equal

func Equal(a, b []byte) bool {
	return string(a) == string(b)
}
unicode包

此包主要針對字符rune類型

是不是十進制數字

func IsDigit(r rune) bool

IsDigit報告一個字符是不是十進制數字字符。

ok := unicode.IsDigit(rune(ip[0]))
	fmt.Printf("%c是十進制數字? %t\n",ip[0],ok)

是不是數字字符

func IsNumber(r rune) bool

IsNumber報告一個字符是不是數字字符

ok = unicode.IsNumber(rune(ip[0]))
	fmt.Printf("%c是數字字符? %t\n",ip[0],ok)

是不是字母

func IsLetter(r rune) bool 

IsLetter報告一個字符是不是字母

ok = unicode.IsLetter(rune(alpha[0]))
	fmt.Printf("%c是字母? %t\n",alpha[0],ok)

是不是小寫字母

func IsLower(r rune) bool

返回字符是不是小寫字母

ok = unicode.IsLower(rune(ip[0]))
fmt.Printf("%c是小寫字母? %t\n",ip[0],ok)

是不是大寫字母

func IsUpper(r rune) bool

返回字符是不是大寫字母。

ok = unicode.IsUpper(rune(alpha2[0]))
fmt.Printf("%c是大寫字母? %t\n",alpha2[0],ok)

返回對應的大寫字母

func ToUpper(r rune) rune

返回對應的大寫字母,不是字母是返回原字符。

fmt.Printf("%c轉換爲大寫字母是%c\n",ip[0],unicode.ToUpper(rune(ip[0])),)

返回對應的小寫字母

func ToLower(r rune) rune

返回對應的小寫字母,不是字母是返回原字符。

fmt.Printf("%c轉換爲小寫字母是%c\n",alpha2[0],unicode.ToLower(rune(alpha2[0])))
所有代碼
package main

import (
	"fmt"
	"strings"
	"unicode"
	"unsafe"
)

func main() {
	//------------------字符型-------------------
	a := 'a'
	fmt.Printf("a的類型%T,a的值:%v,a對應的字符:%c,a的大小:%d\n",a,a,a,unsafe.Sizeof(a))
	you := '你'
	fmt.Printf("you的類型%T,you的值:%v,you對應的字符:%c,you的大小:%d\n",you,you,you,unsafe.Sizeof(you))
	//-----------------字符串--------------------
	str1 := "hello"
	str2 := "你好"
	fmt.Println("str1 str2:",str1,str2)
	//-----------------內存----------------------
	world := "world"
	world1 := "世界"
	fmt.Printf("world:%v world1:%v world:%T,world1:%T\n", world,world1,world,world1)
	fmt.Println("&world[0] &world1 len(world) len(world1):",&world,&world1,len(world),len(world1))
	// &world[0] 不容許取地址

	//-----------------原始字符串----------------
	str3 := "我要換行\n換好啦:)\n"
	str4 := `我想換行\n換不了:(\n`
	fmt.Printf("str3:%vstr4:%v\n",str3,str4)

	//----------------子串----------------------
	fmt.Println("world[:3] world1[3:]:",world[:3],world1[3:])

	//---------------拼接-----------------------
	str5 := str1+world+
		str2+world1
	fmt.Println("str5:",str5)

	//--------------修改(從新賦值)-------------
	tmp := []byte(world)
	tmp[0] = 'W'
	world = string(tmp)
	fmt.Println("world &world",world,&world)

	//-------------遍歷------------------------
	for i:=0;i<len(world1);i=i+3{
		fmt.Print(world1[i:i+3])
	}
	for _,s := range world1{
		fmt.Printf("%c",s)
	}
    fmt.Println()
	//--------------比較-----------------------
	alpha := "abc"
	alpha2 := "Abc"
	fmt.Println("alpha==alpha2 strings.EqualFold(alpha,alpha2):", alpha==alpha2,strings.EqualFold(alpha,alpha2))
	//-------------大小寫轉換-------------------
	fmt.Println("",strings.ToUpper(alpha),strings.ToLower(alpha2))
	//------------去除空格--------------------
	song := "  \n\t兩隻\t老虎\t愛跳舞\n   "
	fmt.Println("去空格 去空格和兩隻 去空格和兩 去空格和跳舞:",strings.TrimSpace(song),strings.Trim(song," \n\t兩隻"),
		strings.TrimLeft(song," \n\t兩"),strings.TrimRight(song," \n兩跳舞"))
	//------------判斷先後綴----------------
	fmt.Println("song[4:]有兩隻前綴嗎? song有愛跳舞后綴嗎?",strings.HasPrefix(song[4:],"兩隻"),strings.HasSuffix(song,"愛跳舞"))
	//-------------拆分與拼接--------------
	ip := "192.168.31.129"
	slice  := strings.Split(ip,".")
	newIp := strings.Join(slice,"?")
	fmt.Println("ip newIP:",ip,newIp)
	//--------------------------------子串--------------------------------
	//-------------包含-------------------
	fmt.Println("song包含老虎嗎? ",strings.Contains(song,"老虎"))
	//------------統計-------------------
	fmt.Println("ip中有幾個.? ",strings.Count(ip,"."))
	//----------查找--------------------
	fmt.Println("ip中第一個1的下標 ip中最後一個1的下標:",strings.Index(ip,"1"),strings.LastIndex(ip,"1"))
	//----------替換-------------------
	fmt.Println("將ip中的.替換爲*",strings.Replace(ip,".","*",-1))
	//----------------------------------判斷-------------------------------
	ok := unicode.IsDigit(rune(ip[0]))
	fmt.Printf("%c是十進制數字? %t\n",ip[0],ok)
	ok = unicode.IsNumber(rune(ip[0]))
	fmt.Printf("%c是數字字符? %t\n",ip[0],ok)
	ok = unicode.IsLetter(rune(alpha[0]))
	fmt.Printf("%c是字母? %t\n",alpha[0],ok)
	ok = unicode.IsLower(rune(ip[0]))
	fmt.Printf("%c是小寫字母? %t\n",ip[0],ok)
	ok = unicode.IsUpper(rune(alpha2[0]))
	fmt.Printf("%c是大寫字母? %t\n",alpha2[0],ok)
	fmt.Printf("%c轉換爲小寫字母是%c\n",alpha2[0],unicode.ToLower(rune(alpha2[0])))
	fmt.Printf("%c轉換爲大寫字母是%c\n",ip[0],unicode.ToUpper(rune(ip[0])),)
}
截圖

參考

Go標準庫-strings

Go標準庫-bytes

Go標準庫-unicode

補充

字符串內部存儲與取出

S := "ab"
	for i,s := range S{
		fmt.Printf("%T %T %T\n",i,s,S[i])
	}

int int32 uint8
int int32 uint8

取出的是rune,存儲的是byte

思考題

如下代碼會輸出什麼?

sentence := "我是lady_killer9"
	for i :=0;i<len(sentence);i++{
		fmt.Printf("%c",sentence[i])
	}
相關文章
相關標籤/搜索