結構體是個很有用的東西,在用計算機語言描述現實世界里的東西時,不得不大量的使用它。把現實世界的某一樣東西的各種屬性,用一個一個的變量記錄下來。
最簡單的比如:平面坐標
平面坐標有兩個值,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 。