Data Type - cruisechang/wiki-golang GitHub Wiki

Golang 對資料的原則

  • 建議針對情況使用較精確的類型。避免浪費資源。
  • 宣告即初始化。變數宣告即可初始化,沒有指定值的變數,會初始化為零值。
  • 方便使用,初始化方式有多種。
  • 容器類型的初始化都是{}。
  • 容器類型的元素值表示法都是{element,element,....}。
  • 容器類型宣告時可以只指定一部分的元素值。

Basic Data Type

Type List

              byte  zero value
bool            1    false
byte            1    0     也可當成uint8
rune            4    0     專用來存unicode。也可看成int32。
int/uint        -    0     byte length depend on os
int8/uint8      1    0
int16/uint16    2    0
int32/uint32    4    0
int64/uint64    8    0
float32         4    0.0
float64         8    0.0
complex64       8    0.0+0.0i 
complex32       16   0.0+0.0i

string          -    ""     

整數表示法 10進制 8進制=0開頭 16進制=0x開頭

rune專門用來存放Unicode編碼,rune有多種表示法。不同表示法有各自的表示範圍

var r rune
r='a' or '-' or '_'  //只要是Unicode編碼的字
r='\xFF'
r='\063'
r='\u4E00'      //四位十六進制
r='\U4E000041'  //八位十六進制

//可用來表示特殊符號(只有下列這些,其餘不合法)
'\n' U+000A  \\換行
'\r' U+000D  \\換頁
'\a'
'\b'
'\f'
'\t'
'\v'
'\\'
'\''
'\"'
//只有這些,其餘的不合法
.....

Container Data Type

Type List

           值類型    參考類型   zero value
Array      o       x       nil   //尚未初始化之前
Slice      x       o       nil   //尚未初始化之前
Map        x       o       nil   //尚未初始化之前
Struct     o       x       nil   //尚未初始化之前    
Channel    x       o       nil   //尚未初始化之前 

只有Slice/Map/Channel三種是Reference Type,其餘都是Value Type。

Value Type(值類型),Reference Type(參考類型)跟function arguments 的pass value(傳值)/pass reference(傳參考)是兩件事。

Golang中的Function(含Method)所有arguments都是pass value,無論value的data type為何。

Array

  • 宣告及初始化

[n]T

  1. 宣告要指名長度及元素類型

  2. 長度n,元素類型為T的Array

  3. 長度無法更改

  4. 不同長度但元素類型相同的Array,是不相等的。

var a [6]int      //全部未賦值,初始都是int零值
a:=[6]int{}         //全部未賦值,初始都是int零值
a:=[6]int{1,2,3}  //部分元素賦值,未賦予值的會是零值
a:=[6]{0:1,1:4}   //指定部分index的元素的初始值,未賦值的是零值
a:=[6]{0:1,3:3}   //不合法。索引必須照順序

a[0]=3        //賦予某元素值
  • 傳值類型

當賦值或參數傳送是會複製一份array傳進去,效能較差。

可使用取址操作,取得指標,然後傳送指標。

每個變數都有類型

golang的變數在編譯時都有已知的類型,且是不可變的。

以下兩個變數的底層類型都相同,但是要經過轉換才能互相指派。

type MyInt int

var i int
var j MyInt