<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
每一個變數都有資料型別,Go中的資料型別有:
當宣告變數的時候,會做預設的賦0初始化。每種資料型別的預設賦0初始化的0值不同,例如int型別的0值為數值0,float的0值為0.0,string型別的0值為空"",bool型別的0值為false,資料結構的0值為nil,struct的0值為欄位全部賦0。
其實函數也有型別,不過一般稱之為返回型別。例如,下面的函數foo的返回型別是int:
func foo() int { ...CODE... return INT_TYPE_VALUE }
函數允許有多個返回值,它們使用逗號分隔,括號包圍:
func foo() (int,bool)
Integer型別是整型資料,例如3 22 0 1 -3 -22
等。
Go中的Integer有以下幾種細分的型別:
其中8 16 32 64
表示該資料型別能儲存的bit位數。例如int8表示能儲存8位元數值,所以這個型別佔用1位元組,也表示最大能儲存的整型數共2^8=256
個,所以int8型別允許的最大正數為127,允許的最小負數為-128,共256個數值。
uint中的u表示unsigned,即無符號整數,只儲存0和正數。所以uint8能儲存256個數的時候,允許的最小值為0,允許的最大值為255。
額外的兩種Integer是byte和rune,它們分別等價於uint8(即一個位元組大小的正數)、int32。從builtin包中的定義就可以知道:
$ go doc builtin | grep -E "byte|rune" type byte = uint8 type rune = int32
byte型別後面會詳細解釋。
還有兩種依賴於CPU位數的型別int和uint,它們分別表示一個機器字長。在32位元CPU上,一個機器字長為32bit,共4位元組,在64位元CPU上,一個機器字長為64bit,共8位元組。除了int和uint依賴於CPU架構,還有一種uintptr也是依賴於機器字長的。
一般來說,需要使用整型資料的時候,指定int即可,有明確的額外需求時再考慮是否換成其它整數型別。
在整數加上0字首表示這是8進位制,例如077
。加上字首0x
表示這是16進位制,例如0x0c
,使用e符號可以表示這是一個科學計數法,如1e3 = 1000,6.023e23 = 6.023 x 10^23
。
可以使用TYPE(N)的方式來生成一個數值,例如a := uint64(5)
。實際上這是型別轉換,將int型別的5轉換成int64型別的5。
Go中沒有專門提供字元型別char,Go內部的所有字元型別(無論是ASCII字元還是其它多位元組字元)都使用整數值儲存,所以字元可以存放到byte、int等資料型別變數中。byte型別等價於uint8型別,表示無符號的1位元組整數。
Go中的字元都使用單引號包圍,例如'a'
、'我'
,但單引號中包含了多個字元是錯誤的(如'aA'
),因為字元型別就是一個字元。
例如,ASCII的字母a表示97。下面這種定義方式是允許的:
var a byte = 'A' // a=65 var b uint8 = 'a' // b=97
注意,字元必須使用單引號,且必須只能是單個字元。所以byte型別經常被稱為character型別。
以下也都是允許的:
var a = 'A' var a uint32 = 'A' var a int64 = 'A'
所以,Integer型別當儲存的是以單引號包圍的字元時,它會將字元轉換成它二進位制值對應的數值。同樣適用於unicode字元,它將用來存放各位元組對應的二進位制的數值:
var a int64 = '我' // a=25105
由於我
在Go中佔用3位元組,所以儲存到byte中是報錯的:
var a byte = '我'
可以儲存它的unicode字元的程式碼點:
var a byte = 'u0041' // a=65,代表的字元A
如果不知道程式碼點的值,可以將其以int型別儲存並輸出。
fmt.Printf("%d", '我') // 25105
如果想將byte值轉換為字元,可以使用string()函數做簡單的型別轉換:
var a = 'A' println(string(a)) // 輸出:A
float是浮點數(俗稱小數),例如0.0 3.0 -3.12 -3.120
等。
Go中的浮點數型別float有兩種:float32和float64。
complex表示複數型別(虛數),有complex64和complex128。
浮點數在計算機系統中非常複雜,對於學習來說,只需將其認為是數學中的一種小數即可。但以下幾個注意點需要謹記心中:
1.01-0.99
從數學運算的角度上得到的值是0.02,但實際上的結果是0.020000000000000018(python運算的結果),在Go中會將其表示為+2.000000e-002
。這個結果是一種極限趨近於我們期待值的結果。==
和不等值!=
比較,例如(3.2-2.8) == 0.4
返回Flase。如果非要比較,應該通過它們的減法求絕對值,再與一個足夠小(不會影響結果)的值做不等比較,例如abs((3.2-2.8)-0.4) < 0.0002
返回True。一般來說,在程式中需要使用浮點數的時候都使用float64型別,不僅因為精確,更因為幾乎所有包中需要float引數的型別都是float64。
在Go的數學運算中,預設取的是整型資料,如果想要得到浮點數結果,必須至少讓運算的一方寫成浮點數格式:
var a := 3/2 // a得到截斷的整數:a=1 var b := 3/2.0 // b為浮點數b=+1.500000e+000 var c := 3 + 2.0 // c為浮點數
Go中的string用於儲存UTF-8字元序列,它是動態大小的。對於字母和英文字母,它佔用一個位元組,對於其它unicode字元,按需佔用2-4個位元組。例如中文字元佔用3個位元組。
Go中的string型別要使用雙引號或反引號包圍,它們的區別是:
abncd
表示ab後換行加cdfunc main() { println("abcndef") println(`ABC DEF`) }
上面的結果將輸出:
abc def ABC DEF
不能使用單引號包圍,單引號包圍的表示它的二進位制值轉換成十進位制的數值。例如字母對應的是ASCII碼。這個在前面byte型別中介紹過。所以,使用單引號包圍的字元實際上是整數數值。例如'a'
等價於97。
string的底層是byte陣列,每個string其實只佔用兩個機器字長:一個指標和一個長度。只不過這個指標在Go中完全不可見,所以對我們來說,string是一個底層byte陣列的值型別而非指標型別。
所以,可以將一個string使用append()或copy()拷貝到一個給定的byte slice中,也可以使用slice的切片功能擷取string中的片段。
func main() { var a = "Hello Gaoxiaofang" println(a[2:3]) // 輸出:l s1 := make([]byte,30) copy(s1,a) // 將字串儲存到slice中 println(string(s1)) // 輸出"Hello Gaoxiaofang" }
使用加號+
連線兩段字串:"Hello" + "World"等價於"HelloWorld"。
可以通過+
的方式將多行連線起來。例如:
str := "Beginning string "+ "second string"
字串連線+
操作符強制認為它兩邊的都是string型別,所以"abcd" + 2
將報錯。需要先將int型別的2轉換為字串型別(不能使用string(2)
的方式轉換,因為這種轉換方式不能跨大型別轉換,只能使用strconv
包中的函數轉換)。
另一種更高效的字串串接方式是使用strings
包中的Join()函數,它可以在緩衝中將字串串接起來。
使用len()取位元組數量(不是字元數量)。
例如len("abcde")
返回5,size(我是中國人)
返回15。
可以將字串當作陣列,使用索引號取部分字串(按位元組計算),索引號從0開始計算,如"abcd"[1]
。
從字串取字元的時候,需要注意的是index按位元組計算而非按字元計算。兩種取資料方式:
"string"[x] "string"[x:y]
第一種方式將返回第(x+1)個位元組對應字元的二進位制數值,例如字母將轉換為ASCII碼,unicode將取對應位元組的二進位制轉換為數值。
第二種方式將返回第(x+1)位元組到第y位元組中間的字元,Go中採取"左閉右開"的方式,所以所擷取部分包括index=x,但不包括index=y。
例如:
func main() { println("abcde"[1]) // (1).輸出"98" println("我是中國人"[1]) // (2).輸出"136" println("abcde"[0:2]) // (3).輸出"ab" println("我是中國人"[0:3]) // (4).輸出"我" println("abcde"[3:4]) // (5).輸出"d" }
分析每一行語句:
字串是字元陣列,如果字串中全是ASCII字元,直接遍歷即可,但如果包含了多位元組字元,則可以[]rune(str)
轉換後後再遍歷。
package main import "fmt" func main() { str := "Hello 你好" r := []rune(str) // 8 for i := 0; i < len(r); i++ { fmt.Printf("%c", r[i]) } }
可以使用< <= > >= == !=
對字串進行比較,它將一個字元一個字元地比對。字母以A-Za-z
的ASCII方式排列。
// 字串比較 println("a" < "B") // false // 數值比較,不是字串比較 println('a' == 97) // true
字串是一個不可變物件,所以對字串s擷取後賦值的方式s[1]="c"
會報錯。
要想修改字串中的字元,必須先將字串拷貝到一個byte slice中,然後修改指定索引位置的字元,最後將byte slice轉換回string型別。
例如,將"gaoxiaofang"改為"maoxiaofang":
s := "gaoxiaofang" bs := []byte(s) bs[0] = 'm' // 必須使用單引號 s = string(bs) println(s)
注意修改字元的時候,必須使用單引號,因為它是byte型別。
bool型別的值只有兩種:true和false。
有3種布林運算運運算元:&& || !
,分別別是邏輯與,邏輯或,取反。
func main() { println(true && true) // true println(true && false) // false println(true || true) // true println(true || false) // true println(!true) // false }
Go是一門非常嚴格的怨言,在使用==
進行等值比較的時候,要求兩邊的資料型別必須相同,否則報錯。如果兩邊資料型別是介面型別,則它們必須實現相同的介面函數。如果是常數比較,則兩邊必須是能夠相容的資料型別。
在printf類的函數的格式中,預留位置%t
用於代表布林值。
布林型別的變數、函數名應該以is或Is的方式開頭來表明這是一個布林型別的東西。例如isSorted()
函數用於檢測內容是否已經排序,IsFinished()
用於判斷是否完成。
可以使用type定義自己的資料型別,例如struct、interface。
還可以使用type定義型別的別名。例如,定義一個int型別的別名INT:
type INT int
這樣INT型別的底層資料結構還是int型別。可以將它和int一樣使用:
var a INT = 5
type中可以一次性宣告多個別名:
type ( CT int IT int32 DT float32 )
reflect包的TypeOf(),或者Printf/Sprintf的"%T"。
package main import ( "reflect" "fmt" ) type IT int32 func main() { var a IT = 322 var b = 22 fmt.Println(reflect.TypeOf(a)) // main.IT fmt.Println(reflect.TypeOf(b)) // int fmt.Println(fmt.Sprintf("%T", a)) // main.IT }
unsafe包的Sizeof()檢視變數或常數所屬資料型別佔用空間的大小。
package main import ( "unsafe" "fmt" ) type IT int32 func main() { var a IT = 322 var b = 22 fmt.Println(unsafe.Sizeof(a)) // 4 fmt.Println(unsafe.Sizeof(b)) // 8 }
更多關於Go語言的資料型別請檢視下面的相關連結
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45