文章目錄
- GO數據類型
- 數組array
- 切片slice
- 集合map
- 結構體
- make和new
GO數據類型
- 在go語言中,定義的全局數據結構不使用不會報錯,定義的局部數據結構必須使用,否則報錯;建議定義的數據類型就要使用,要么不定義。
數組array
類似于python的list,有下標查找方法
- array與list的區別:
- array是固定長度的數組,沒有append、pop等方法;
- array作為值傳入函數或者是賦值給變量的是原始值拷貝不會,任何修改不會影響原始值;
var l1 [5]int = [5]int{1, 2, 3, 4, 5} //定義
l2 := [5]int{1, 2, 3} //初始化(:= 只能用于函數內部)
切片slice
可以進行切割的數組, 能使用append方法,使用后會返回添加后的切片,slice是底層數組,作為值作為值傳入函數或者是賦值給變量時會改變原始值。
var s []string
var s []string = ['a', 'b']
b = s[:2] //前包后不包
s = append(s, "c") //增大了切片的最大容量,len(s)是4,cap(s)是6
集合map
類似與python的字典,能通過key進行增刪改查
-
map與dict的區別:
- map是無序的key-value集合,遍歷時會無序的返回,而dict是有序的,按順序遍歷;
- map定義時要說明key和value的類型,dict不需要;
- map通過鍵獲取鍵值時,如果鍵不存在,則返回該鍵類型的0值,如:鍵是int類型的返回值是0;而dict通過鍵獲取值,鍵不存在,則會報錯,使用get方法獲取時返回None;
-
注意:
- map定義時必須要初始化,或者使用make來分配內存,否則會報錯因為沒有分配內存空間;
- map是應用類型,如果將他傳遞給一個函數或是賦值給另一個變量,他們指向的都是底層數據結構,一個變化都會變化;
var m = map[int]string{1: "a",2: "b", //結尾括號另起一行時結尾需要有“,”同一行則不需要
}var m1 = make(map[int]string)m1 := make(map[int]string) //:=用于函數內部
m1[1] = "a"
// m = {1: "a", 2: "b"} //不允許這種賦值方式
結構體
結構體自定義數據類型的屬性和方法,是go實現面向對象的方法,通過type來定義
type Person struct{name stringage int
}var person Person //實例化結構體,實例化才會分配內存,才能調用內部的屬性和方法
要創建結構體的方法,需要將結構體作為接收者來定義函數,此時該函數就是該結構體的方法
- 接收者有值接收者和指針接收者,當是值類型接收者時,實例化不能改變當前實例的屬性或方法,指針類型接收者則能改變
type Person struct{Name stringAge int
}//receiver是值類型
func (p Person) SetName(word string) {p.Name = word
}//receiver是指針類型
func (p *Person) SetAge(age int){p.Age = age
}var p1 Person
p1.SetName("lili")
fmt.Println(p1.Name) //空字符串
p1.SetAge(12)
fmt.Println(p1.Age) //12
- 注意:結構體的屬性和方法首字母為大寫才能被模塊外調用,否則只能在模塊內調用
make和new
make和new都可以給定義的數據類型分配空間
- 區別:
- make只能給slice、map、channel分配空間;
- make分配完后返回的是數據類型的值,是對數據類型的初始化,new返回的是指針;
- 很少使用到new