1. 程式人生 > >3、基本資料型別&運算

3、基本資料型別&運算

1、整型

整數型別:
無符號與有符號型別:
有符號型別:int、int8、int16、int32、int64
無符號型別:uint、uint8、uint16、uint32、uint64
基於架構的型別:int、uint、uintptr(視其作業系統而定,比如64位作業系統,int則對應int64;uintptr的長度被設定為足夠存放一個指標)
別名:byte等價於uint8,用於強調數值是一個原始資料而不是一個整數;rune等價於int32,用於表示一個Unicode碼點。
注意:
即使特定情況下int是32位,與int32也需要顯示轉換。
有符號整數均採用補碼形式表示:最高位作為符號位,值域為-2^(n-1)到2^(n-1)-1;如int8值域為-128到127;而uint8則為0到255。

2、運算子:

算術運算子:+、-、*、/、%、++、- -
%取模,結果符號與被取模數符號一樣;自增與自減獨佔一行,作為語句,不能作為表示式。
關係運算符:==、!=、<、>、<=、>=
邏輯運算子:
&&:邏輯and運算子,true&&true=true;只要一個是false,結果就為false。
||:邏輯or運算子,只要有一個true,結果就為true
!:邏輯not運算子,!true=false
位運算子:&、|、^、<<、>>
設a=1010
b=0110
則a&b表示兩者對應位上全為1則結果為1否則為0,即0010
a|b表示兩者對應位上有一個1則結果為1否則為0,即1110
a^b表示兩者對應位上為不同數字則結果為1否則為0,即1100
a<<2表示左移2位也即乘以2的2次方,二進位制結果為101000
a>>2表示右移2位也即除以2的2次方,二進位制結果為10
賦值運算子:

=、+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=
均是先運算再賦值
其他運算子:
&:返回變數儲存地址,&x
*:取出指標儲存的變數的值*p
運算子優先順序:

優先順序 運算子
highest ^、!
*、/、%、<<、>>、&、&^
+、-、|、^
==、!=、<、>、<=、>=
<-(channel)
&&
lowest ||

3、浮點型

go提供了兩種精度的浮點數:float32與float64
取值範圍:
浮點數型別的取值範圍可以在math包找到。常量math.MaxFloat32表示float32能表示的最大數值:約為3.4e38;最小值約為1.4e-45。float64的取值範圍約為:4.9e-324到1.8e308。
精度:
float32可以提供大約6個精度,float64大約可以提供15個精度。

4、複數

go提供了兩種複數型別:complex64和complex128,分別對應float32與float64兩種浮點數。
構造:
內建的complex函式用於構建複數:

var x complex128=complex(1,2)//1+2i

5、布林型

布林型的值只有兩個:true和false。if和for條件部分都是布林型的值。

6、字串

字串本質上就是一個不可改變的定長位元組序列陣列。go語言中的字符采用UTF-8編碼,如果字元為ASCII碼則佔用一個位元組,其他根據需要佔用2-4個位元組,以最大限度地減少空間的佔用。
字串的截斷與連線:
內建的len函式可以返回一個字串中的位元組數目(非字元數目),索引s[i]返回第i個位元組的位元組值,0 <= i < en(s),第i個位元組並不一定是字串的第i個字元,某些非ACSII字元需要2個及以上的位元組。

//字串的截斷會生成一個新的字串,s[i:j]基於原始的s字串的第i個位元組開始到第j個位元組生成一個新字串,不含j。
//如果i,j被忽略,則用0作為開始位置,len(s)作為結束的位置
s := "hello, world"
fmt.Println(s[0:5])//hello
fmt.Println(s[:5])//hello
fmt.Println(s[7:])//world
fmt.Println(s[:])//hello,world
//字串的連線會生成一個新的字串,使用+號連線

解釋型字串面值與原生字串面值:
解釋型字串面值:將字元序列包含在雙引號裡即可。
常見轉義方式:
\a——響鈴
\b——退格
\f——換頁
\n——換行
\r——回車
\t——製表符
\v——垂直製表符
\’——單引號
\"——雙引號
\\——反斜槓
可以通過十六進位制或八進位制轉義在字串面值包含任意的位元組。十六進位制的轉義形式:\xhh(hh表示十六進位制數字)。八進位制轉義形式:\ooo,包含三個八進位制的數字(0-7),不能超過\377(即十進位制的255)
原生字串面值:
使用反引號代替雙引號,在原始字串中沒有轉義操作;包含換行等操作全是字面意思。由於正則表示式包含很多反斜槓,此時應用原生字串會比較方便。
字串重要方法:
字串處理的四個重要包:bytes、strings、strconv、unicode。
bytes包提供了很多功能類似的函式,但是針對和字串有著同樣結構的[]bytes型別。字串時只讀的,逐步構建字串會導致很多分配和複製,在此情況下,使用bytes.Buffer型別就更有效。
strings包提供了諸如字串的查詢、替換、比較、截斷、拆分、合併等功能。
strconv包提供了布林型、整數型、浮點數、對應字串的相互轉化,還提供了雙引號轉義相關的轉換。
unicode包提供了IsDigit、IsLetter、IsUpper和IsLower等類似功能,它們用於給字元分類。

//字串一旦建立就不可修改,而一個位元組的slice的元素可以自由修改
s :="abc"
a :=[]byte(s)//產生一個新位元組陣列儲存源字串資料的副本
s2 :=string(a)//引用副本再次構造一個副本,a即使被修改,s字串也不會改變
//bytes包提供了Buffer型別用於位元組slice的快取。一個Buffer一開始是空的,即使是零值也有效,不需要人工初始化,可以動態增長
func intsToString(values []int) string{
	var buf bytes.Buffer
	buf.WriteByte('[')//writeByte方法對於ACSII碼字元更有效,對於中文用WriteRune則更加有效
	for i,v:=range values{
	if i>0{
	buf.WriteString(",")
	}
	fmt.Fprintf(&buf,"%d",v)
	}
	buf.WriteByte(']')
	return buf.String()
}
func main(){
	fmt.Println(intsToString([]int{1,2,3}))
}
//常見函式之strings,bytes中也有類似的包,字串引數被位元組slice型別替代
//字串替換,Replace用於將字串str中的前n個字串old替換為字串new,並返回一個新的字串,如果n = -1則替換所有字串 old 為字串 new
func Replace(str, old, new, n) string
//重複count次字串s並返回一個新的字串
func Repeat(s, count int) string
//修剪字串可以使用strings.TrimSpace(s)來剔除字串開頭和結尾的空白符號;如果你想要剔除指定字元,則可以使用 strings.Trim(s, "a") 來將開頭和結尾的a去除掉。該函式的第二個引數可以包含任何字元,如果你只想剔除開頭或者結尾的字串,則可以使用TrimLeft或者TrimRight來實現
func ToLower(s) string//將字串中的 Unicode 字元全部轉換為相應的小寫字元
func ToUpper(s) string//將字串中的 Unicode 字元全部轉換為相應的大寫字元
func Contains(s,substr string) bool//判斷字串s是否包含substr
func Count(s,sep string) int//用於計算字串sep在字串s中出現的非重疊次數
func Fields(s string) []string//將會利用1個或多個空白符號來作為動態長度的分隔符將字串分割成若干小塊,並返回一個slice,如果字串只包含空白符號,則返回一個長度為0的slice
func HasPrefix(s,prefix string) bool//判斷字串s是否以prefix開頭
func HasSuffix(s, suffix string) bool//判斷字串s是否以suffix結尾
func Index(s,sep string) int//返回字串str在字串s中的索引(str的第一個字元的索引),-1 表示字串s不包含字串 str
func Join(a []string,sep string) string//用於將元素型別為string的slice使用分割符號來拼接組成一個字串
//與字串相關的型別轉換都是通過strconv包實現的
//從數字型別轉換到字串
strconv.Itoa(i int) string //返回數字 i 所表示的字串型別的十進位制數
strconv.FormatFloat(f float64, fmt byte, prec int, bitSize int) string //將 64 位浮點型的數字轉換為字串,其中 fmt 表示格式(其值可以是 'b'、'e'、'f' 或 'g'),prec 表示精度,bitSize 則使用 32 表示 float32,用 64 表示 float64。
//從字串型別轉換為數字型別
strconv.Atoi(s string) (i int, err error) //將字串轉換為 int 型
strconv.ParseFloat(s string, bitSize int) (f float64, err error) //將字串轉換為 float64 型

7、Printf轉換格式

%d %x %o %b %T
int變數 16進位制int 8進位制int 2進位制int 列印變數型別
%f %g &e %t %%
float32型別 float64型別 科學計數法 布林變數 字元型百分比標誌
%c %s %q %v %p
rune,Unicode字元型別 string string或者rune型別 以易讀形式列印任意變數 指標