(一)數組
//數組定義:var variable_name [SIZE] variable_type var arr [10] int //以上為一維數組的定義方式。例如以下定義了數組 arr 長度為 10 類型為int: //初始化數組: var b = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0} //初始化數組中 {} 中的元素個數不能大於 [] 中的數字。如果忽略 [] 中的數字不設置數組大小,Go 語言會根據元素的個數來設置數組的大小: b := []float32{1000.0, 2.0, 3.4, 7.0, 50.0}
(二)切片
定義:Go 語言切片是對數組的抽象。
Go 數組的長度不可改變,在特定場景中這樣的集合就不太適用,Go中提供了一種靈活,功能強悍的內置類型切片("動態數組"),與數組相比切片的長度是不固定的,可以追加元素,在追加時可能使切片的容量增大。
//你可以聲明一個未指定大小的數組來定義切片:
var identifier []type
使用make函數定義切片。或使用make()函數來創建切片:
var slice1 []type = make([]type, len) 簡寫為:slice1 := make([]type, len)
其中len代表長度,cap代表最長多少 例如:make([]T, length, capacity)
// 創建一個整型切片其長度和容量都是 10 個元素
slice := make([]int, 10)
創建一個整型切片其長度為 3 個元素,容量為 5 個元素
slice := make([]int, 3, 5)
//下邊這個函數可以打印切片
func printfslic(x [] int) {
fmt.Printf("切片的長度為%d,最大為%d,slice為%v。。第二個參數為:%d\n",len(x),cap(x),x)
}
//其中nil切片/空切片。切片擴容。/切片賦值-限制切片容量
具體以后整理下:
現在看下這個自己打印下。https://www.cnblogs.com/sparkdev/p/10704614.html
(三)結構體
Go 語言中數組可以存儲同一類型的數據,但在結構體中我們可以為不同項定義不同的數據類型。 結構體是由一系列具有相同類型或不同類型的數據構成的數據集合。 結構體定義需要使用 type 和 struct 語句。struct 語句定義一個新的數據類型,結構體中有一個或多個成員。type 語句設定了結構體的名稱。結構體的格式如下: type struct_variable_type struct { member definition member definition ... member definition } 一旦定義了結構體類型,它就能用於變量的聲明,語法格式如下 variable_name := structure_variable_type {value1, value2...valuen} 或 variable_name := structure_variable_type { key1: value1, key2: value2..., keyn: valuen} 例子: package main import "fmt" type person struct{ name string age int ismarry bool } func main() { tongtong := person{"張tongtong",25,false} fmt.Println(tongtong) tongtong1 := person{name:"張tongtong",age:27,ismarry:true} fmt.Println(tongtong1) }
(四)指針
Go 語言中指針是很容易學習的,Go 語言中使用指針可以更簡單的執行一些任務。 Go 語言的取地址符是 &,放到一個變量前使用就會返回相應變量的內存地址。 package main import "fmt" func main() { a := 10 fmt.Printf("變量的地址: %x\n", &a ) //打印出來a變量的地址 } 什么是指針?一個指針變量指向了一個值的內存地址。類似於變量和常量,在使用指針前你需要聲明指針。指針聲明格式如下: --在指針類型前面加上 * 號(前綴)來獲取指針所指向的內容。-- var var_name *var-type func main() { //var ip *int // 指向整型的空指針 //var fp *float32 // 指向浮點型的空指針 a := 10 var ip *int //定義一個指針變量 ip = &a //指向a的內存地址 fmt.Printf("a 變量的地址是: %x\n", &a ) /* 指針變量的存儲地址 */ fmt.Printf("ip 變量儲存的指針地址: %x\n", ip ) /* 使用指針訪問值 */ fmt.Printf("*ip 變量的值: %d\n", *ip ) } //結果為 a 變量的地址是: c000014078 ip 變量儲存的指針地址: c000014078 *ip 變量的值: 10
(五)范圍range
package main import "fmt" type person struct{ name string age int ismarry bool } func main() { numSlice := []int{1,3,2,3} nums := 0 for _,val := range numSlice { nums += val } fmt.Println("nums:", nums) //這個是index for i, num := range numSlice { if num == 3 { fmt.Println("index:", i) } } kvs := map[string]string{"a": "apple", "b": "banana"} for k, v := range kvs { fmt.Printf("%s -> %s\n", k, v) } //range也可以用來枚舉Unicode字符串。第一個參數是字符的索引,第二個是字符(Unicode的值)本身。 for i, c := range "go" { fmt.Println(i, c) } }
(六)接口
1. 什么是interface接口
interface 是GO語言的基礎特性之一。可以理解為一種類型的規范或者約定。它跟java,C# 不太一樣,不需要顯示說明實現了某個接口,它沒有繼承或子類或“implements”關鍵字,只是通過約定的形式,隱式的實現interface 中的方法即可。因此,Golang 中的 interface 讓編碼更靈活、易擴展。
如何理解go 語言中的interface ? 只需記住以下三點即可:
1. interface 是方法聲明的集合
2. 任何類型的對象實現了在interface 接口中聲明的全部方法,則表明該類型實現了該接口。
3. interface 可以作為一種數據類型,實現了該接口的任何對象都可以給對應的接口類型變量賦值。
注意:
a. interface 可以被任意對象實現,一個類型/對象也可以實現多個 interface
b. 方法不能重載,如 eat() eat(s string) 不能同時存在
package main import "fmt" type Person interface { car() } type Women struct{} func (women Women) car() { fmt.Println("女人開車") } type Man struct{} func (man Man) car() { fmt.Println("男人開車") } func main() { var person Person person = new(Women) person.car() person = new(Man) person.car() }