Go語言學習(4) - 基本資料型別

翻身碼農把歌唱發表於2018-11-26

Go語言中的資料型別包含兩種:

  • 基本資料型別(原生資料型別):整型、浮點型、布林型、字串、字元(byte、rune)
  • 複合資料型別(派生資料型別):指標(pointer)、陣列(array)、切片(slice)、對映(map)、函式(function)、結構體(struct)、通道(channel)

整型

整型分為兩大類

  • 按長度分:int8、int16、int32、int64、int
  • 無符號整型:uint8、uint16、uint32、uint64、uint

其中,uint8就是byte型、int16對應C語言中的short型、int64對應C語言中的long型

序號 型別和描述
1 uint8:無符號8位整型(0到255)【2的8次方】
2 uint16:無符號16位整型(0到65535)【2的16次方】
3 uint32:無符號32位整型(0到4292967295)【2的32次方】
4 uint64:無符號位64位整型(0到 18446744073709551615)【2的64次方】
5 int8:有符號8位整型(-128到127)
6 int16:有符號16位整型(-32768到32767)
7 uint32:有符號32位整型(-2147483648到2147483647)
8 uint64:有符號位64位整型(-9223372036854775808到 9223372036854775807)

還有其他數字型別

序號 型別和描述
1 byte 類似 uint8
2 rune 類似int32
3 uint 32或者64位,根據電腦機器的位數決定
4 int 與uint一樣大小
5 uintptr 無符號整型,用於存放一個指標

當超過資料型別所要求的長度時,就會報錯:constant xxx overflows byte。

字元

下面看一下 byte 和 rune 到底是不是 我們上面描述的,分別 對應 uint8 和 int32,程式碼如下,我們還是列印出變數的型別 和 值:

package main
import "fmt"

func main() {

	a := 100
	var b byte = 100
	var c rune = 200

	fmt.Printf("%T %v \n", a , a)
	fmt.Printf("%T %v \n", b , b)
	fmt.Printf("%T %v \n", c , c)
}
複製程式碼

輸出結果如下:

int 100 
uint8 100 
int32 200 
複製程式碼

事實證明,我們上面描述的是沒有問題的。實際上,我們通常不會將 byte 和 rune 直接賦值為 數字型別,我們通常 賦值為 字元,類似於 Java 中的 char,如下:

	var e byte = 'a'
	var f rune = 'A'
	fmt.Printf("%T %v \n", e , e)
	fmt.Printf("%T %v \n", f , f)
複製程式碼

輸出結果如下:

uint8 97 
int32 65 
複製程式碼

那麼,byte 和 rune 有什麼區別呢?我們先來看一個例子,假設 將 上面的 f 值 賦值為 漢字 大寫的 一,那麼 是怎麼樣的結果呢,然後將 e 的 值也賦值為 “一”,結果是什麼呢?

我們會發現,將 f 賦值為 “一”,輸出 為:int32 19968;將 e 賦值為 “一”,會報一個異常:constant 19968 overflows byte,這是因為 byte 即 uint8 的最大值 是 255,而 “一” 對應的值 為 19968,遠遠大於 uint8 的最大值。

byte 和 rune 的區別如下:

  • byte型:其實就是 uint8 的別名,代表了一個ASCLL 碼的一個字元
  • rune型:其實就是 int32 ,代表了一個UTF-8字元,當需要處理中文等 unicode 字符集時就要用到 rune 型別

字串

字串在Go語言中是以基本資料型別出現的。

在Go語言中,字串 即可以單行定義,又可以多行定義,單行定義 不需要闡述,下面我們介紹下定義多行字串

  • 雙引號書寫字串被稱為字串字面量,這種字面量不能跨行;
  • 多行字串需要使用 “·” 反引號(位於Tab鍵上面的一個),多用於內嵌原始碼 和 內嵌資料;
  • 在反引號中的所有程式碼不會被編譯器識別,而只是作為字串的一部分

當我們想 將 一段程式碼作為 字串輸出的時候,我們 發現 要輸出 就只能 調為一行,但Go語言給我們提供了 多行字串,如下:

	temp := `
		a := 100
		var b byte = 256
		var c rune = 200

		fmt.Printf("%T %v \n", a , a)
		fmt.Printf("%T %v \n", b , b)
		fmt.Printf("%T %v \n", c , c)
	`
	fmt.Println(temp)
複製程式碼

輸出結果如下:

		a := 100
		var b byte = 256
		var c rune = 200

		fmt.Printf("%T %v \n", a , a)
		fmt.Printf("%T %v \n", b , b)
		fmt.Printf("%T %v \n", c , c)
複製程式碼

這樣就可以講 我們拷貝的一段程式碼 原樣輸出。

以上主要講解了 基本資料型別,後續 會繼續講解 派生資料型別。

歡迎關注我的公眾號,第一時間接收文章推送~ 搜尋公眾號: 翻身碼農把歌唱 或者 掃描下方二維碼:

img

相關文章