1. 程式人生 > 其它 >go基礎-資料型別二

go基礎-資料型別二

資料型別

概覽

基本資料型別

  • 布林型別:bool
  • 整型:int8、byte、int16、int、uint、uintptr 等
  • 浮點型別:float32、float64
  • 複數型別:complex64、complex128
  • 字串:string
  • 字元型別:rune
  • 錯誤型別:error

複合型別

  • 指標(pointer)
  • 陣列(array)
  • 切片(slice)
  • 字典(map)
  • 通道(chan)
  • 結構體(struct)
  • 介面(interface)

複合資料型別

陣列

var a [8]byte // 長度為8的陣列,每個元素為一個位元組
var b [3][3]int // 二維陣列(9宮格)
var c [3][3][3]float64 // 三維陣列(立體的9宮格)
var d = [3]int{1, 2, 3}  // 宣告時初始化
var e = new([3]string)   // 通過 new 初始化
a := [5]int{1,2,3,4,5}
a := [...]int{1, 2, 3} // 省略長度宣告
a := [5]int{1, 2, 3} // 初始化的時候長度是5,而填充了3個數據,那麼剩餘的兩位會用0填充 [1 2 3 0 0]
a := [5]int{1: 3, 3: 7} // 指定下標位置的元素值 [0 3 0 7 0]

陣列長度在聲明後就不可更改

陣列的長度在定義之後無法修改,陣列長度是陣列型別本身的一部分,是陣列的一個內建常量,因此我們無法在陣列上做動態的元素增刪操作。

陣列元素的訪問和設定

arr := [5]int{1,2,3,4,5}
a1, a2 := arr[0], arr[len(arr) - 1] // a1=1 a2=5
arr[0] = 10 // 設定陣列第一個元素的值為10 [10 2 3 4 5]

切片

var slice []string = []string{"a", "b", "c"} // 宣告一個切片
// 基於陣列建立一個切片
months := [...]string{"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} // 定義一個月份的陣列
q2 := months[3:6]    // 第二季度 [April May June]
summer := months[5:8]  // 夏季 [June July August]
all := months[:] // 全年資料
firsthalf := months[:6] // 上半年
secondhalf := months[6:] // 下半年

切片底層引用了一個數組,由三個部分構成 —— 指標、長度和容量,指標指向陣列起始下標,長度對應切片中元素的個數,容量則是切片起始位置到底層陣列結尾的位置,切片長度不能超過容量

len(q2) // 獲取切片長度
cap(q2) // 獲取切片容量

// 切片長度不能超過容量
// 直接建立一個切片
mySlice1 := make([]int, 5, 10) // 初始長度為5的整型,容量為10的切片
mySlice3 := []int{1, 2, 3, 4, 5} // 這種方式建立的,長度和容量都是5

字典map

// map 字典型別 string 字典鍵的型別 int 字典值的型別
var testMap map[string]int
testMap := map[string]int{
  "one": 1,
  "two": 2,
  "three": 3,
}
// 像切片那樣用make建立,第二個引數100是初始容量,超出會自動擴容
var testMap = make(map[string]int, 100)
// 注意,用make初始化後,只能像下邊這樣進行賦值
testMap["one"] = 1
testMap["two"] = 2

指標型別

變數的本質對一塊記憶體空間的命名,我們可以通過引用變數名來使用這塊記憶體空間儲存的值,而指標則是用來指向這些變數值所在記憶體地址的值

var ptr *int // 宣告指標型別, 指標的預設值是<nil>
a := 100
ptr = &a      // 初始化指標型別值為變數 a 這時ptr列印的時候應該是記憶體地址的值
fmt.Println(ptr) // 0x1400011a008
fmt.Println(*ptr) // 100

b := 200
ptr1 := &b
fmt.Println(ptr1) // 0x1400001e060
*ptr1 = 100
fmt.Println(*ptr1) // 100
fmt.Println(b) // 100

指標型別轉化

i := 10
var p *int = &i
var fp *float32 = (*float32)(unsafe.Pointer(p))
*fp = *fp * 10
fmt.Println(i)  // 100