(一)數組
//數組定義: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()
}
