go語言資料型別分類:基礎型別、復合型別、引用型別和介面型別
基礎型別:數字、字串和布林型
有符號和無符號的整數運算:int8、int16、int32、int64四種不同大小的有符號整數型別
uint8、uint16、uint32、uint64四種無符號整數型別
unicode字元rune型別是和int32等價的型別,通常用於表示乙個unicode碼點,這兩個名稱可以互換使用
byte是uint8型別的等價型別,byte型別一般用於強調數值是乙個原始的資料而不是乙個小的整數
無符號整數型別uintptr,沒有指定具體的bit大小但是足以容納指標
在go語言中,%取模運算子的符號和被取模數的符號總是一致的
除法運算子/的行為依賴於運算元是否全為整數
乙個算術運算的結果,不管是有符號或者是無符號的,如果需要更多的bit位才能正確表示的話,就說明計算結果是溢位了。超出的高位的bit位部分將被丟棄
var i int8 = 127fmt.println(i, i+1, i*i)
位運算子^作為二元運算子時是按位異或(xor),當用作一元運算子時表示按位取反
位操作運算子&^用於按位置零(and not):如果對應y中bit位為1,表示式z = x &^ y結果z的對應的bit位為0,否則z對應的bit位等於x相應的bit位的值
左移運算子用零填充右邊空缺的bit位,無符號的右移運算也是用0填充左邊空缺的bit位,但是有符號數的右移運算會用符號位的值填充左邊空缺的bit位
一般更傾向於使用有符號數,無符號數往往只有在位運算或其它特殊的運算場景才會使用,像bit集合、分析二進位制檔案格式或雜湊和加密操作等,通常並不用於僅僅是表達非負數量的場合
當使用fmt包列印乙個數值時,可以用%d、%o或%x引數控制輸出的進製格式
fmt的兩個使用技巧:通常printf格式化字串包含多個%引數時將會包含對應相同數量的額外運算元,但是%之後的[1]副詞告訴printf函式再次使用第乙個運算元;
%後的#副詞告訴printf在用%o、%x或%x輸出時生成0、0x或0x字首
字元使用%c引數列印,或者是用%q引數列印帶單引號的字元
go語言提供了兩種精度的浮點數,float32和float64
浮點數的範圍極限值可以在math包中找到,常量math.maxfloat32表示float32能表示的最大數值,大約是3.4e38;對應的math.maxfloat64常量大約是1.8e308
float32的有效bit位只有23個,其它的bit位用於指數和符號
用printf函式的%g引數列印浮點數,將採用更緊湊的表示形式列印,並提供足夠的精度
對應**的資料,使用%e(帶指數)或%f的形式列印可能更合適
nan非數,函式math.isnan用於測試乙個數是否是非數nan,math.nan則返回非數對應的值
go語言提供了兩種精度的複數型別:complex64和complex128,分別對應float32和float64兩種浮點數精度
內建的complex函式用於構建複數,內建的real和imag函式分別返回複數的實部和虛部
math/cmplx包提供了複數處理的許多函式,例如求複數的平方根函式和求冪函式
fmt.println(cmplx.sqrt(-1))
乙個布林型別的值只有兩種:true和false
布林值可以和&&和||操作符結合,並且有短路行為
&&的優先順序比||高
乙個字串是乙個不可改變的位元組序列
非ascii字元的utf8編碼會要兩個或多個位元組
不變性意味著如果兩個字串共享相同的底層資料的話也是安全的,這使得複製任何長度的字串代價是低廉的。同樣,乙個字串s和對應的子字串切片s[7:]的操作也可以安全地共享相同的記憶體,因此字串切片操作代價也是低廉的。在這兩種情況下都沒有必要分配新的記憶體
go語言原始檔總是用utf8編碼,並且go語言的文字字串也以utf8編碼的方式處理,因此可以將unicode碼點也寫到字串面值中
乙個原生的字串面值形式是`...`,使用反引號代替雙引號。在原生的字串面值中,沒有轉義操作;全部的內容都是字面的意思,包含退格和換行,因此乙個程式中的原生字串面值可能跨越多行(譯註:在原生字串面值內部是無法直接寫`字元的,可以用八進位制或十六進製制轉義或+"`"鏈結字串常量完成)
unicode每個符號都分配乙個唯一的unicode碼點,unicode碼點對應go語言中的rune整數型別,rune是int32等價型別
utf8是乙個將unicode碼點編碼為位元組序列的變長編碼
??unicode和utf8
標準庫中strings包提供了許多如字串的查詢、替換、比較、截斷、拆分和合併等功能
bytes包也提供了很多類似功能的函式
strconv包提供了布林型、整型數、浮點數和對應字串的相互轉換,還提供了雙引號轉義相關的轉換
unicode包提供了isdigit、isletter、isupper和islower等類似功能,它們用於給字元分類。每個函式有乙個單一的rune型別的引數,然後返回乙個布林值。toupper、tolower
basename實現
package mainfunc basename(s
string) string
}for i:=len(s)-1;i>=0;i--
}return
s}
package mainimport
"strings
"func basename2(s
string) string
return
s}
位元組slice是可變的byte型別,將乙個位元組slice轉到字串的操作是構造乙個字串拷貝,以保證複製後的字串是唯讀的
為了避免轉換中不必要的記憶體分配,bytes包和strings同時提供了許多實用函式。
strings包中的六個函式:func contains(s, substr string) bool
func count(s, sep string) int
func fields(s string) string
func hasprefix(s, prefix string) bool
func index(s, sep string) int
func join(a string, sep string) string
bytes包中也對應的六個函式:
func contains(b, subslice byte) bool
func count(s, sep byte) int
func fields(s byte) byte
func hasprefix(s, prefix byte) bool
func index(s, sep byte) int
func join(s byte, sep byte) byte
bytes包還提供了buffer型別用於位元組slice的快取。乙個buffer開始是空的,但是隨著string、byte或byte等型別資料的寫入可以動態增長,乙個bytes.buffer變數並不需要初始化,因為零值也是有效的
當向bytes.buffer新增任意字元的utf8編碼時,最好使用bytes.buffer的writerune方法,但是writebyte方法對於寫入類似'['和']'等ascii字元則會更加有效。
字串和數字的轉換 strconv包提供這類轉換功能
將乙個整數轉為字串,一種方法是用fmt.sprintf返回乙個格式化的字串;另乙個方法是用strconv.itoa() 整數到ascii
formatint和formatuint函式可以用不同的進製來格式化數字
字串到整數,可以使用strconv包的atoi或parseint函式,還有用於解析無符號整數的parseuint函式
常量表示式的值在編譯期計算,而不是在執行期
所有常量的運算都可以在編譯期完成,這樣可以減少執行時的工作,也方便其他編譯優化。當運算元是常量時,一些執行時的錯誤也可以在編譯時被發現,例如整數除0、字串索引越界、任何導致無效浮點數的操作等
iota常量生成器,用於生成一組以相似規則初始化的常量,但是不用每行都寫一遍初始化表示式。在乙個const宣告語句中,在第乙個宣告的常量所在的行,iota將會被設定為0,然後在每乙個有常量宣告的行加一
無型別常量
第三章 資料型別
1.資料型別分類 基本型別 整數型別 short int,int,long int long long int浮點數型別 float 單精度 double 雙精度 long double 字元型別 char 布林型別 bool 列舉型別 通過sizeof 可以看到,每種型別在記憶體中預留的位置是多大...
第三章 Python資料型別
3.1 python簡單資料型別 3.1.1 字串 str python中的字串通常由單引號 雙引號 三個單引號或三個雙引號包圍的一串字元組成。1.轉義字串 n 換行符 t 製表符 r 回車 字元 單引號字串中的單引號 雙引號字串中的雙引號 2.字串運算 python中是可以使用 運算子運算的。連線...
第三章 資料型別(中)測試
1.列表 元組 字串是 python 的 序列。無序 2.填空題 關鍵字既可以刪除列表中的乙個元素,也可以刪除整個列表。正確答案 del 3.填空題 已知列表 x 1,2,3 那麼執行語句 x.pop 0 之後,x 的值為 正確答案 2,3 這個要特別注意的是要細心.注意 pop 0 表示去首位而不...