標籤:字串 英文 ring for eve 檔案 需要 tmp 詳解
一、字串原理解析
1. 字串底層就是一個byte數組,所以可以和[]byte類型互相轉換;(字串可以存文本,也可以存二進位,因為其本來就是一個位元組流)
2. 字串之中的字元是不能修改的,字串是一個唯讀類型,不能直接修改,那怎麼修改呢(待解決(練習題中練習1有解決(轉換為位元組數組進行修改)))?
樣本如下:
我們可以發現已經飄紅了,並有英文提示不能修改字串中的字元。
說明Go語言中字串是一個唯讀的類型,並不能直接修改。
3. 字串是由byte位元組組成,所以字串的長度是byte位元組的長度,byte是一個int8別名;
樣本見樣本1-1
4. rune類型用來表示utf8字元,一個rune字元由1個或多個byte組成,rune是一個int32的別名;
補充:
1) 字元與位元組關係?
答:如果是英文字元,1個字元對應1個byte(位元組),如果是中文字元,1個字元對應2個,甚至是3個、4個byte;
2) UTF8編碼?
答:utf8針對最大的好處是,其實可變的,如果是英文字元,其就給1個byte,如果是中文就根據其需要的給定指定的字元個數,這對於網路頻寬的節省是很重要的。
3) rune類型其實就是int32類型;
執行個體1-1
//聲明array.go檔案屬於 main包package main//引入其他的包 fmt是系統的標準輸入輸出庫import ("fmt")//入口執行函數,main包必須有一個main函數,這個在go語言中是強制的func main() {//聲明一個str變數 類型為 string 字串var str string //方法二 str := "string" 等str = "abc漢子"//聲明一個byte數組也可以叫位元組數組都是一個意思var b []byte = []byte(str) //方法二 b :=[]byte(str) //將str強制轉換為位元組數組([]byte)var chars []rune = []rune(str) //將str轉換為rune數組([]rune)//格式化列印b的值和b位元組數組的長度fmt.Printf("b =%v,len(str)=%d\n", b, len(str))fmt.Printf("%c\n", 97)fmt.Printf("chars=%v,chars count:%d\n", chars, len(chars))}
執行結果如下:
d:\PROJECT\src\base-3\array-1>go run array.gob =[97 98 99 230 177 137 229 173 144],len(str)=9achars=[97 98 99 27721 23376],chars count:5
解釋:
1) 輸出的就是ASCII碼(字元,不論是英文還是中文在底層儲存的都是一個整數ASCII碼),97對應的就是a;
2) 由執行個體看到一個"漢"字由三個位元組組成,對應的ASCII碼為230 177 137;
3) str字串的長度為9,因為底層儲存的是位元組數組,可以看到輸出9個位元組,所以長度為9,而不是表面我們數的5個(字元是5個);
4) chars count:5 表示str字元的長度為5(我們需要將字串(預設是ASCII編碼)轉換為rune類型進行計算)
5)chars =[97 98 99 27721 23376]:表示的是str字串各個字元對應在底層的utf8編碼
二、練習題
練習1:寫一個程式,對英文字串進行逆序。
方法1:複雜寫法
package mainimport ("fmt")func main() {var str string = "abcdefg"bytes := []byte(str) //字串中的字元不能直接修改,所以我們這裡轉成byte數組//var i int//i = 0//var i = 0for i := 0; i < len(bytes)/2; i++ { //要除以2,因為一次迴圈做2次操作//fmt.Printf("%c ", str[i]) //列印出來的是字串中的位元組數組//通過將第一個和最後一個進行交換實現逆序var tmp = bytes[i] //將前一個賦值為一個臨時變數bytes[i] = bytes[len(bytes)-i-1] //將前一個賦值為後一個bytes[len(bytes)-i-1] = tmp //將後一個賦值為前一個}str = string(bytes) //將byte數群組轉換為字串fmt.Printf("reverse string:%s\n", str)}
執行結果:
d:\PROJECT\src\day1\day-1\base-3\array-2>go run main.goreverse string:gfedcba
方法2:進階寫法
package mainimport ( "fmt")func main() { var str string = "abcdefg" bytes := []byte(str) for i := 0; i < len(bytes)/2; i++ { bytes[i], bytes[len(bytes)-i-1] = bytes[len(bytes)-i-1], bytes[i] //兩個變數拿起來直接交換即可 } str = string(bytes) //將byte數群組轉換為字串 fmt.Printf("reverse string:%s\n", str)}
Go語言入門2--字串詳解