1、數據類型 go語言支持的基礎類型: 整型:int,int8,int16,int32,int64 無符號整型:uint,uint8,uint16,uint32,uint64 其中預設類型為int,int表示32位或64位與操作系統有關 位元組:byte 布爾:bool 浮點型:float32,flo ...
1、數據類型
go語言支持的基礎類型:
整型:int,int8,int16,int32,int64
無符號整型:uint,uint8,uint16,uint32,uint64
其中預設類型為int,int表示32位或64位與操作系統有關
位元組:byte
布爾:bool
浮點型:float32,float64,預設類型為float64
複數:complex64(32位實部和虛部),complex128(63位實部和虛部),預設類型為complex128
指針:uintptr,本質為無符整型uint8
字元串:string
字元:rune,本質為int32,可表示unicode編碼
錯誤類型:error,本質為介面
go支持的複合類型:
指針*,數組,結構體struct
切片slice,字典map,通道channel,介面interface
基礎類型的預設值:
數據類型 | 預設值 |
整型 | 0 |
浮點型 | 0 |
布爾值 | false |
字元串 | "" |
值類型和引用類型:
值類型和引用類型的區別在於,在賦值或作為函數參數調用時,值類型會複製一份新的拷貝,新數據的修改不會影響原數據,而引用類型只會複製變數的引用,引用數據的修改會影響原數據
值類型:基礎數據類型,指針,數組,結構體
引用類型:切片,map,channel,interface
數組和切片的定義:
// 數組定義 a :=[5]int{1,2,3,4,5} a := [...]int{1,2,3,4,5} // 切片定義 a :=[]int{1,2,3,4,5} a := a[1:3]
切片底層實際是一個三元組:指針、len、cap
使用make創建切片
make是Go語言的內置函數 mySlice1 := make([]int, 5) //元素個數為5 ,初始值為0 mySlice2 := make([]int, 5, 10) //len為5,cap為10 mySlice3 := []int{1, 2, 3, 4, 5} //len為5,cap為5 mySlice4 := mySlice3 [1:3] // len為2,cap為4,容量為1到最後
切片的容量增長:
函數append會智能地處理底層數組的容量增長,在切片容量小於1000個元素時, 總是會成倍地增加容量,一旦元素個數超過1000,時,容量的增長因數會設為1.25,也就是每次增加25%的容量
各個類型所占的記憶體(64位環境):
指針類型:8個位元組
string類型:16個位元組,包含一個指針,指向真實地址,和一個int類型表示長度
數組類型:總位元組數為單個元素占用大小乘以個數
切片類型:包含一個指向數組的指針,一個int類型表示長度,一個cap類型表示容量,總共24位元組
map類型:8個位元組,本身為一個指針,指向map自己
struct類型:大小為所有成員大小的總和
interface{}:占用記憶體為16位元組,包含兩個指針
map定義:
map的鍵可以使任何值,包括內置類型或結構體,只要可以用==進行比較,但不能是切片、函數以及包含切片的數據結構由於具有引用語義不能作為映射的鍵
var colors map[string]string colors["red"] = "#da1337" // panic: assignment to entry in nil map
聲明和初始化:
colors := make(map[string]string) colors := map[string]string{} 取值:color, ok := colors["red"] 遍歷:for k, v := range colors
nil切片和空切片
創建nil切片:var slice []int
創建空切片:
slice := make([]int, 0)
slice := []int{}