中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

golang 碎片整理之 結構體

發布時間:2020-08-11 15:55:03 來源:網絡 閱讀:314 作者:霍帥兵 欄目:編程語言

什么是結構體?

結構體(struct)是用戶自定義的類型,它代表若干字段的集合,可以用于描述一個實體對象,類似Java中的class,是golang面向對象編程的基礎。
結構體的概念在軟件工程上的舊術語是ADT(抽象數據類型: Abstract Date type)。在c++它也是存在,并且名字也是struct,在面向對象的編程語言中,跟一個無方法的輕量級類一樣。因為在Go語言中沒有類的概念,所以在go中結構體有著很重要的地位。

如何定義一個結構體

type Coordinate struct {
    X,Y float32
}

上述代碼定義了一個名為Coordinate的結構體,里面包括了兩個float32的變量X,Y。該結構體可用于描述一個平面坐標。

添加對象方法

在go語言中,對象方法在結構體定義的外部添加

type Coordinate struct {
    X,Y float32
}
func (coo *Coordinate) GetCoordinate() {
    fmt.Printf("(%.2f, %.2f)\n", coo.X, coo.Y)
        return 
}

其中,func關鍵字后面的(coo *Coordinate),表示該函數傳入一個指向Coordinate的指針,可通過指針變量coo來操作結構體的值。

幾種結構體的初始化

  1. 按照原始字段順序通過創建結構體
    package main
    import (
    "fmt"
    )
    func main(){
    p0 := Coordinate{1,2}
    p0.GetCoordinate()
    }

    輸出:(1.00, 2.00),其中X=1,Y=2

2.按照自定義字段順序進行初始化

package main
import (
    "fmt"
)
func main(){
    p0 := Coordinate{Y:1, X:2}
    p0.GetCoordinate()
}

輸出:(2.00,1.00),其中X=2,Y=1

3.通過new函數創建

package main
import (
                "fmt"
)
func main(){
                p0 := new(Coordinate)
                P0.X=1
                p0.Y=2
                p0.GetCoordinate()
}

其中p0 := new(Coordinate)等價于以下寫法
p3 := &Coordinate{X:1,Y:2}
p3 := &Coordinate{1,2}
比較三種創建方式,其中,第一種和第二種,p0均為一個類型為Coordinate的實例,而第三種p0為一個指向Coordinate的指針,相當于 var p0 *Coordinate = new(Coordinate)

添加值拷貝的對象方法

剛才說了,添加一個對象方法,可以通過func (t *T) functionname() 來創建,其中t是一個指針變量。我們也可以通過值拷貝的方法,添加一個對象方法,語法為 func(t T) functionname()

package main
import (
    "fmt"
)
type Coordinate struct {
    X, Y float32
}

func (coo *Coordinate) GetCoordinate() {
    fmt.Printf("(%.2f,%.2f)\n", coo.X, coo.Y)
    return
}
//值拷貝對象方法
func (coo Coordinate) SetPosition01(a float32,b float32) {
    coo.X = a
    coo.Y = b
}

//指針變量對象方法
func (coo *Coordinate) SetPosition02(a float32,b float32) {
    coo.X = a
    coo.Y = b
}
func main(){
    p0 := Coordinate{1, 2}
    fmt.Print("SetPosition02調用前:")
    p0.GetCoordinate()
    p0.SetPosition02(0, 0)
    fmt.Print("SetPosition02調用后:")
    p0.GetCoordinate()
}

輸出:
SetPosition01調用前:(1.00,2.00)
SetPosition01調用后:(1.00,2.00)
SetPosition02調用前:(1.00,2.00)
SetPosition02調用后:(0.00,0.00)

從程序輸出中可以看出,調用SetPosition01方法,發生了值拷貝,即使在方法內改變了coo的值,外部的p0的值沒有被改變。而SetPosition02方法中,coo為指向p0地址的指針,由于是通過指針變量修改了X,Y的值,所以調用完畢后,外部p0的值會被修改為(0,0)

匿名結構體

package main
import (
    "fmt"
)
func main(){
    p_3d := struct {
            X,Y,Z float32
        }{1,2,3}
        fmt.Println("------輸出p_3d--------")
        fmt.Printf("%v\n%T\n",p_3d, p_3d)
}

輸出為:

-------輸出p_3d-------
{1 2 3}
struct { X float32; Y float32; Z float32 }

golang構造函數

Go語言的結構體沒有構造函數,我們可以自己實現。 例如,下方的代碼就實現了一個person的構造函數。 因為struct是值類型,如果結構體比較復雜的話,值拷貝性能開銷會比較大,所以該構造函數返回的是結構體指針類型。

func newPerson(name, city string, age int8) *person {
    return &person{
        name: name,
        city: city,
        age:  age,
    }
}

調用構造函數
p9 := newPerson("張三", "沙河", 90)
fmt.Printf("%#v\n", p9) //&main.person{name:"張三", city:"沙河", age:90}

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新民市| 英吉沙县| 喀喇沁旗| 蓬溪县| 丘北县| 嵊州市| 科技| 隆回县| 太谷县| 古浪县| 凤台县| 八宿县| 柘荣县| 建始县| 永胜县| 墨江| 清水河县| 延津县| 贵港市| 温宿县| 三江| 读书| 乌鲁木齐市| 遵化市| 肇源县| 澳门| 浦县| 阿城市| 迭部县| 陵水| 永泰县| 印江| 邻水| 泰兴市| 黎城县| 九龙县| 武义县| 石嘴山市| 伊川县| 融水| 海阳市|