目錄html
上篇文章思考題前端
字符型git
字符串型golang
內存後端
原始字符串數組
返回子串安全
拼接ide
修改函數
遍歷ui
結果: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])),) }截圖
字符串內部存儲與取出
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]) }