Go學習筆記day02-複合類型變量-指針,結構體,數組,切片

一.指針

       類型 *T 是指向 T 類型值的指針。其零值爲 nil

   & 操作符會生成一個指向其操作數的指針。

   * 操作符表示指針指向的底層值(變量值)。

//指針-例
package main

import "fmt"

func main() {
	i, j := 42, 2701

	p := &i         // 指向 i
	fmt.Println(p) // 讀取指針 的值   輸出:0x414020
	fmt.Println(*p) // 通過指針讀取 i 的值    輸出:42
	*p = 21         // 通過指針設置 i 的值    輸出:21
	fmt.Println(i)  // 查看 i 的值

	p = &j         // 指向 j
	*p = *p / 37   // 通過指針對 j 進行除法運算
	fmt.Println(j) // 查看 j 的值    輸出:73
}

二.結構體:一個結構體(struct)就是一組字段(field)。可以看做是key_value鍵值對.

   2.1 結構體字段

//結構體
//例一
package main

import "fmt"

type Vertex struct {
	X int
	Y int
}

func main() {
	fmt.Println(Vertex{1, 2})
}
//輸出
{1 2}

//例二
//結構體字段
//結構體字段使用點號來訪問。
package main

import "fmt"

type Vertex struct {
	X int
	Y int
}

func main() {
	v := Vertex{1, 2}
	v.X = 4
	fmt.Println(v.X)    //輸出4
    fmt.Println(v)      //輸出{4 2}
}

   2.2 結構體指針

  如果我們有一個指向結構體的指針 p,那麼可以通過 (*p).X 來訪問其字段 X。不過這麼寫太囉嗦了,所以語言也允許我們使用隱式間接引用,直接寫 p.X 就可以。即 (*p).X 等同於p.x.

package main

import "fmt"

type Vertex struct {
	X int
	Y int
}

func main() {
	v := Vertex{1, 2}
	p := &v
	p.X = 100
	fmt.Println(v)         //輸出{100 2}
	(*p).X = 200
	fmt.Println(v)         //輸出{200 2}
}

   使用 Name: 語法可以給結構體指定字段賦值

   特殊的前綴 & 返回一個指向結構體的指針。

package main

import "fmt"

type Vertex struct {
	X, Y int
}

var (
	v1 = Vertex{1, 2}  // 創建一個 Vertex 類型的結構體
	v2 = Vertex{X: 1}  // Y:0 被隱式地賦予
	v3 = Vertex{X: 1,Y: 9}  // Y:0 被隱式地賦予
	v4 = Vertex{}      // X:0 Y:0
	p  = &Vertex{1, 2} // 創建一個 *Vertex 類型的結構體(指針)
)

func main() {
	fmt.Println(v1, v2, v3, v4, p)
}

//輸出
{1 2} {1 0} {1 9} {0 0} &{1 2}

三. 數組

 3.1 定義
   var a [10]int   表示: 類型 [n]T表示擁有 n個 T類型的值的數組。數組的長度是其類型的一部分,因此數組不能改變大小.

package main

import "fmt"

func main() {
	var a [2]string
	a[0] = "Hello"
	a[1] = "World"
	fmt.Println(a[0], a[1])     //輸出Hello World
	fmt.Println(a)              //輸出[Hello World]

	primes := [6]int{2, 3, 5, 7, 11, 13}
	fmt.Println(primes)         //輸出[2 3 5 7 11 15]
	primes = [6]int{2, 3}
	fmt.Println(primes)         //輸出[2 3 0 0 0 0]
}

   3.2 切片

每個數組的大小都是固定的。而切片則爲數組元素提供動態大小的、靈活的視角。在實踐中,切片比數組更常用。

類型 []T 表示一個元素類型爲 T 的切片。

切片通過兩個下標來界定,即一個上界和一個下界,二者以冒號分隔:

a[low : high]

它會選擇一個半開區間,包括第一個元素,但排除最後一個元素。

以下表達式創建了一個切片,它包含 a 中下標從 1 到 3 的元素:

a[1:4]
package main

import "fmt"

func main() {
	primes := [6]int{2, 3, 5, 7, 11, 13}

	var s []int = primes[1:4]
	fmt.Println(s)        //輸出[3 5 7]
}

切片值傳遞方式爲引用傳遞

//例一
package main

import "fmt"

func main() {
	names := [4]string{
		"John",
		"Paul",
		"George",
		"Ringo",
	}
	fmt.Println(names)        //輸出[John Paul George Ringo]

	a := names[0:2]
	b := names[1:3]
	fmt.Println(a, b)         //輸出[John Paul] [Paul George]

	b[0] = "XXX"
	fmt.Println(a, b)         //輸出[John XXX] [XXX George]
	fmt.Println(names)        //輸出[John XXX George Ringo]
}


//例二
package main

import "fmt"

func main() {
	q := []int{2, 3, 5, 7, 11, 13}
	fmt.Println(q)           //輸出[2 3 5 7 11 13]

	r := []bool{true, false, true, true, false, true}
	fmt.Println(r)           //輸出[true false true true false true]

	s := []struct {
		i int
		b bool
	}{
		{2, true},
		{3, false},
		{5, true},
		{7, true},
		{11, false},
		{13, true},
	}
	fmt.Println(s)           //輸出[{2 true} {3 false} {5 true} {7 true} {11 false} {13 true}]
}

切片的默認行爲

在進行切片時,你可以利用它的默認行爲來忽略上下界。

切片下界的默認值爲 0,上界則是該切片的長度。

對於數組

var a [10]int

來說,以下切片是等價的:

a[0:10]
a[:10]
a[0:]
a[:]
package main

import "fmt"

func main() {
	s := []int{2, 3, 5, 7, 11, 13}

	s = s[1:4]
	fmt.Println(s)     //輸出[3 5 7]

	s = s[:2]
	fmt.Println(s)     //輸出[3 5]

	s = s[1:]
	fmt.Println(s)     //輸出[5]
	
	var a [10]int
	fmt.Println(a)     //輸出[0 0 0 0 0 0 0 0 0 0]
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章