天天看點

Golang從入門到精通(十四):Golang結構體

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)
}