17. 結構體及用指針訪問結構體

結構體是個很有用的東西,在用計算機語言描述現實世界里的東西時,不得不大量的使用它。把現實世界的某一樣東西的各種屬性,用一個一個的變量記錄下來。
最簡單的比如:平面坐標
平面坐標有兩個值,X和Y
在go語言中可以這樣定義一個坐標的結構體

type Coodinate struct{
    X int
    Y int
}

由于定義一個結構體是為了各種地方都能夠調用,甚至外部調用。所以,無論是結構體的命名,還是結構體結構內部的組成元素都是首字母大寫。(go語言一個簡單的規則,大寫首字母可供外部調用,小寫首字母只在一定范圍內調用。)
下面簡單打印一下這個坐標結構體吧。

package main

import (
    "fmt"
)
type Coodinate struct{
    X int
    Y int
}
func main() {
    fmt.Println(Coodinate{5, 10})
}

打印的結果也與一般的輸出不同,結構體的輸出是帶有 { } 符號的。

{5 10}

結構提里的組成元素,稱之為“字段”,可以使用符號 “.” 來訪問。

Co := Coodinate{15, 20}
Co.X = 1973

上面的代碼,初始化了一個結構體,又修改了其中X的值。
把剛才完整代碼改一下

package main

import (
    "fmt"
)
type Coodinate struct{
    X int
    Y int
}
func main() {
    fmt.Println(Coodinate{5, 10})
    Co := Coodinate{15, 20}    //聲明一個變量Co為結構體類型,并初始化。
    fmt.Println(Co)
    Co.X = 1973        //修改變量結構體的字段X值
    fmt.Println(Co)
}

運行結果是這樣的

{5 10}
{15 20}
{1973 20}

可以看到,在代碼中,既能夠直接使用結構體,又可以聲明一個變量為結構體。然后對變量進行操作,例如修改變量結構體里的某個字段。
還記得指針嗎?指針重點你要知道是利用內存地址來操作數據。變量是結構體類型,一樣有內存地址。取地址方法是變量前加 & 符號

&Co

下面看看用指針如何修改一個變量結構體的。

package main

import (
    "fmt"
)
type Coodinate struct{
    X int
    Y int
}
func main() {
    fmt.Println(Coodinate{5, 10})
    Co := Coodinate{15, 20}     //聲明一個變量Co為結構體類型,并初始化。
    fmt.Println(Co)
    Co.X = 1973                 //修改變量結構體的字段X值
    fmt.Println(Co)

    //下面用指針訪問結構體
    p := &Co
    p.X = 1975
    p.Y = 45
    fmt.Println("Pointer control result is", Co)
}

運行結果是這樣的

{5 10}
{15 20}
{1973 20}
Pointer control result is {1975 45}

通過指針間接的訪問是透明的。
結構體初始化的時候,不是必須給結構體內所有的字段都做初始化的。沒有初始化的字段,會根據字段類型取它自己的零值(默認值)。方法如下

package main

import (
    "fmt"
)
type Coodinate struct{
    X int
    Y int
}
var(
    Co1 = Coodinate{73, 45}
    Co2 = Coodinate{X:75}
    Co3 = Coodinate{}
    p = &Coodinate{9, 17}
)
func main() {
    //結構體的初始化賦值
    fmt.Println(Co1, Co2, Co3, p, *p)
}

運行結果是這樣的

{73 45} {75 0} {0 0} &{9 17} {9 17}

注意看 p 和 *p 的不同結果。p 返回的結果有一個特殊的前綴 &,是指向結構體的指針。
打印指針需要在變量前加 * 符號。所以是 *p 。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容