陣列
package main
import "fmt"
//陣列
//必須制定存放的元素的型別和容量(長度)
//陣列的長度是陣列型別的一部分
func main() {
var a1 [3]bool //[true false true]
var a2 [4]bool //[true false true false]
a1 = [3]bool{true, true, true} //初始化陣列
//根據初始化值自動腿短陣列的長度是多少
a3 := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
//根據索引方式來初始化
a4 := [5]int{0: 1, 4: 2}
fmt.Println(a1, a2, a3, a4)
//陣列的遍歷
citys := [...]string{"北京", "上海", "廣州", "深圳"}
for i, v := range citys {
fmt.Println(i, v)
}
//多維陣列
all := [3][10]int{
{0, 1, 2, 3}, /* 第一行索引為 0 */
{4, 5, 6, 7}, /* 第二行索引為 1 */
{8, 9, 10, 11}, /* 第三行索引為 2 */
}
fmt.Println(all)
}
切片
- 切片指向了一個底層的陣列
- 切片的長度就是它元素的個數
- 切片的容量是底層陣列從切片的第一個元素到最後一個元素的數量
package main
import "fmt"
func main() {
//切片的定義
var s1 []int //定義一個存放int 型別元素的切片
var s2 []string //頂一個存放string 型別的元素的切片
fmt.Println(s1, s2)
//初始化
s1 = []int{1, 2, 3}
s2 = []string{"中國", "美國", "日本"}
fmt.Println(s1, s2)
//由陣列得到切片
a1 := [...]int{1, 8, 3, 5, 6, 8, 56, 85}
s3 := a1[0:3] //基於一個陣列切割,左包含,右不包含(左閉右開) 注意跟定義陣列key對應的值的區別
fmt.Println(s3)
s4 := a1[:4] //[0:4]
s5 := a1[3:] //[3:len(al)]
s6 := a1[:] //[0:len(al)]
fmt.Println(s4, s5, s6)
}
package main
import "fmt"
func main() {
a1 := make([]int, 5, 10)
fmt.Printf("a1=%v len(a1)=%d cap(a1)=%d\n", a1, len(a1), cap(a1))
//切片就是一個框,框柱了一塊連續的記憶體,屬於引用型別,真正的資料都是儲存在底層陣列裡的
//切片之間不能比較的,我們不能使用== 操作符來判斷兩個切片是否含有全部相等元素,切片唯一合法的比較操作是喝nil比較
//一個nil值得切片並沒有底層陣列,一個nil值得切片長度和容量都是0,但是我們不能說一個長度和容量都是0的切片一定是nil,
//例如
var s1 []int
s2 := []int{}
s3 := make([]int, 0)
fmt.Println(s1, s2, s3)
//判斷切片是否是空的 需要用len() == 0 來判斷 ,不應該使用s ==nil來判斷
//切片的賦值
a2 := []int{1, 2, 3, 6}
a3 := a2
fmt.Println(a2, a3) //[1000 2 3 6]
a3[0] = 1000
fmt.Println(a2, a3) //[1000 2 3 6]
}
append()
package main
import "fmt"
func main() {
//append()為切片追加元素
s1 := []string{"北京", "上海", "深圳"}
fmt.Printf("s1 = %v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1))
//呼叫append 函式必須要用原來的切片變數接收返回值
s1 = append(s1, "廣州") //append 追加元素,原來的底層陣列放不下的時候,go底層就會吧底層陣列換一個地方
fmt.Printf("s1 = %v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1))
s1 = append(s1, "成都")
fmt.Printf("s1 = %v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1))
ss := []string{"武漢", "西安", "重慶"}
s1 = append(s1, ss...) //...表示拆開
fmt.Printf("s1 = %v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1))
}
copy() and 刪除切片元素
package main
import "fmt"
func main() {
a1 := []int{1, 5, 6, 9}
a2 := a1 //賦值
var a3 = make([]int, 3, 3)
copy(a3, a1) //a1的值賦值到a3
fmt.Println(a1, a2, a3)
a1[0] = 100
fmt.Println(a1, a2, a3)
//將a1中的索引為1的3這個元素刪掉
//刪除的原理是修改底層陣列,用後面的值覆蓋掉需要刪除的值
//1)切片不儲存具體值
//2)切片對應一個底層陣列
//3)底層陣列都是佔用一塊連續的記憶體
a1 = append(a1[:1], a1[2:]...)
fmt.Println(a1)
}
指標
package main
import "fmt"
func main() {
//go 語言中不存在操作指標
//1. & 取地址
n := 18
p := &n
fmt.Println(p) //0xc00000c1a8
//2.* 根據地址取值
m := *p
fmt.Println(m) //18
var a1 *int //nil pointer
var a2 = new(int) //初始化
*a2 = 100
//make 和 new的區別
//1.make 和new 都是用來申請記憶體的
//2.new 很少用,一般用來給基本資料型別申請記憶體,string,int 返回的是對應型別的指標(*string,*int)
//3.make 是用來給slice ,map,chan申請記憶體的,make函式返回的是對應的這三個型別本身
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結