emm,發覺自己沒有系統的學習。都是有需求來臨時調研技術,從今天起每天抽出時間系統化學習Go.
類型
Go是靜態類型語言,運行期間不能改變類型
定義
- 可以使用var 關鍵字
- 可以使用 := 讓系統推導類型
example:
var a int
a := 0
是一致的
但是要注意一點
var a int
f := func () {
a:=1 //此時是局部變量(沒進行參數傳遞)
}
f()
此時a的值不會變
更靈活的語法:
var x , y ,z int
x,y,z := 1,float64(12313),"dassad" //動態類型推導,不建議這麼寫,增加閱讀難度
特殊佔位符 _
_用於將結果忽略的位置
func test() (int, string) {
return 1, "abc"
}
func main() {
_, s := test()
println(s)
}
代碼塊定義
代碼塊內有新的變量生命週期
s := "abc"
println(&s)
s, y := "hello", 20 // 重新賦值: 與前 s 在同⼀層次的代碼塊中,且有新的變量被定義。
println(&s, y) // 通常函數多返回值 err 會被重複使⽤。
{
s, z := 1000, 30 // 定義新同名變量: 不在同⼀層次代碼塊。
println(&s, z)
}
基本類型
類型 | 長度 | 默認值 | 說明 |
---|---|---|---|
bool | 1 | false | |
byte | 1 | 0 | uint8 之間可以相互轉換 |
rune | 4 | 0 | unicode code point,int32 |
int/uint | 4或者8 | 0 | 32位長度4 64位長度8 |
int8/uint8 | 1 | 0 | -128~127, 0~255 |
int16/uint16 | 2 | 0 | -32768~32767,0~65535 |
int32/uint32 | 4或者8 | 0 | 32位長度4 64位長度8, 21億正負 |
int64/uint64 | 8 | 0 | |
complex64 | 8 | 0 | 複數類型 |
complex128 | 16 | 0 | 複數類型 |
array | 值類型 | ||
struct | 值類型 | ||
string | "" | 值類型 | |
slice | 4或者8 | nil | 引用類型 |
map | 4或者8 | nil | 引用類型 |
channel | 4或者8 | nil | 引用類型 |
interface | nil | 接口類型 | |
function | nil | 函數類型 |
new 和 make對引用類型的區別
引⽤類型包括 slice、map 和 channel。它們有複雜的內部結構,除了申請內存外,還需 要初始化相關屬性。
new會計算引用類型大小,併爲其分配初始值(默認值),並返回指針
make會被編譯期編譯爲具體創建函數,分配內存和初始化成員結構,返回對象而非指針
a:=[]int{0,0,0}
a[1] = 10
b := make([]int, 3)
b[1] = 10
c:=new([]int) //指針,但是隻有頭指針,可以append,但是不能直接使用
c[1]=10
常量
golang的常量只支持編譯器可確定的類型。(數字、字符串、布爾)
不能定義在方法體內部
常量值還可以是 len、cap、unsafe.Sizeof 等編譯期可確定結果的函數返回值。
重點: 編譯期可確定的值(因爲常量是不可寫的,要在編譯期確定結果,放入常量內存區域)
枚舉
關鍵字 iota 定義常量組中從 0 開始按⾏計數的⾃增枚舉值。
每一個const內iota都會從0開始
const (
Sunday = iota // 0
Monday // 1,通常省略後續⾏表達式。
Tuesday // 2
Wednesday // 3
Thursday // 4
Friday // 5
Saturday // 6
)
const (
Sunday1 = iota // 0
Monday1 // 1,通常省略後續⾏表達式。
Tuesday1 // 2
Wednesday1 // 3
Thursday1 // 4
Friday1 // 5
Saturday1 // 6
)