Golang是一門很特殊的語言,雖然它出生比較晚,但是在很多地方卻和現在的程式設計語言有所不同。現在的程式設計語言要麼是函數式的、要麼是面向對象的,而Go語言卻有指針、結構體這些概念,并解決了C語言的一些坑。從這個角度上說,Golang可以看做C語言的填坑加強版。
結構體簡介
Go 語言通過類型别名(alias types)和結構體的形式支援使用者自定義類型,或者叫定制類型。一個帶屬性的結構體試圖表示一個現實世界中的實體。結構體是複合類型(composite types),當需要定義一個類型,它由一系列屬性組成,每個屬性都有自己的類型和值的時候,就應該使用結構體,它把資料聚集在一起。然後可以通路這些資料,就好像它是一個獨立實體的一部分。結構體也是值類型,是以可以通過 new 函數來建立。
組成結構體類型的那些資料稱為 字段(fields)。每個字段都有一個類型和一個名字;在一個結構體中,字段名字必須是唯一的。
結構體的概念在軟體工程上舊的術語叫 ADT(抽象資料類型:Abstract Data Type)。在 C++ 它也存在,并且名字也是 struct,在面向對象的程式設計語言中,跟一個無方法的輕量級類一樣。因為 Go 語言中沒有類的概念,是以在 Go 中結構體有着更為重要的地位。
結構體定義
結構體定義的一般方式如下:
type identifier struct {
field1 type1
field2 type2
...
}
在結構體内部定義它們的成員變量和類型,隻是類型要放到後面,并且變量之間不用逗号。
例如:
type Student struct {
name string
age int
weight float32
score []int
}
如果成員變量的類型相同的話,可以把它們寫到同一行。是以
type T struct {a, b int}
也是合法的文法,它更适用于簡單的結構體。
結構體裡的字段都有 名字,像 field1、field2 等,如果字段在代碼中從來也不會被用到,那麼可以命名它為 _。
結構體初始化
這裡有兩種方式可以初始化結構體,按原始字段順序進行初始化和自定義字段順序進行初始化。
在Go語言裡可以直接使用 fmt.Println 列印一個結構體,預設輸出可以很好的顯示它的内容,類似使用 %v 選項。
就像在面向對象語言所作的那樣,可以使用點号符給字段指派:
structname.fieldname = value
同樣的,使用點号符可以擷取結構體字段的值:
structname.fieldname
示例代碼如下:
package main
import (
"fmt"
)
type Student struct {
name string
age int
weight float32
score []int
}
func main() {
stu01 := Student{"stu01",,, []int,,}} //按照字段順序進行初始化
stu02 := Student{age:, weight:, score: []int,}, name: "stu02"} ///通過 field:value 形式初始化,該方式可以自定義初始化字段的順序
stu01.age =
fmt.Println(stu01.age)
fmt.Println(stu02)
}
結構體new函數
關于結構體和指針的結合我們在下一關重點講下,這裡簡單提下它們的組合使用。
一般在進行例如
type T struct {a, b int}
的結構體定義之後
習慣使用
t := new(T)
給該結構體變量配置設定記憶體,它傳回指向已配置設定記憶體的指針。變量
t
是一個指向
T
的指針,此時結構體字段的值是它們所屬類型的零值。
聲明
var t T
也會給 t 配置設定記憶體,并零值化記憶體,但是這個時候
t
是類型
T
。在這兩種方式中,t 通常被稱做類型
T
的一個執行個體
(instance)
或對象
(Object)
。
var t *T = new(T)
等價于
t := new(T)
。
一個簡單的結構體
new
函數的例子如下:
package main
import "fmt"
type struct1 struct {
i1 int
f1 float32
str string
}
func main() {
ms := new(struct1)
ms.i1 =
ms.f1 =
ms.str= "Chris"
fmt.Printf("The int is: %d\n", ms.i1)
fmt.Printf("The float is: %f\n", ms.f1)
fmt.Printf("The string is: %s\n", ms.str)
fmt.Println(ms)
}