Go語言結構體

Go 語言中數組能夠存儲同一類型的數據,但在結構體中咱們能夠爲不一樣項定義不一樣的數據類型。python

結構體是由一系列具備相同類型或不一樣類型的數據構成的數據集合。linux

struct 特色

一、用來自定義複雜數據結構
二、struct裏面能夠包含一個或多個字段(屬性)
三、struct類型能夠定義方法,注意和函數的區分
四、struct類型是值類型
五、struct類型能夠嵌套
六、結構體是用戶單獨定義的類型,不能和其餘類型進行強制轉換
七、Go中的struct沒有構造函數,通常可使用工廠模式來解決這個問題
八、咱們能夠爲struct中的每一個字段,寫上一個tag。這個tag能夠經過反射的機制獲取到,最經常使用的場景就是json序列化和反序列化
九、訪問結構體成員, 用 "." 來鏈接,格式爲:"結構體.成員名"golang

struct 定義

可用 type 在全局或函數內定義新類型。
第一種,定義一個新的數據類型,結構體中只有一個成員。json

type bigint int64
type smallint int8

新類型不是原類型的別名,除擁有相數組

type oldboy struct {
    Linux  string
    Python string
    Golang string
}

第三種,定義一個新的數據類型,指向結構體的指針。數據結構

同數據存儲結構外,它們之間沒有任何關係,不會持有原類型任何信息。除非目標類型是未命名類型,不然必須顯式轉換。函數

第二種,定義一個新的數據類型,結構體中有多個成員。spa

type Linux string

type oldboy struct {
    *Linux
}

不能同時嵌入某一類型和其指針類型,由於它們名字相同。實例以下:指針

package main

type Linux string

type oldboy struct {
    *Linux
    Linux
}

func main() {

}

編譯錯誤:code

./main.go:7:2: duplicate field Linux

struct 初始化

有序初始化: 結構體中的多個成員的值,必須一一對應。
無序初始化: 結構體中的多個成員的值,無須一一對應,可初始化部分值。

package main

type oldboy struct {
    Linux  string
    Python string
    Golang string
}

// 有序初始化
var ordered = oldboy{"linux", "python", "golang"}

// 無序初始化
var disordered = oldboy{Golang: "golang"}

func main() {
}

結構體初始化方法有以下幾種:

package main

import (
    "fmt"
)

type oldboy struct {
    int
    string
}

var one oldboy

func main() {
    two := new(oldboy) //同 var two *oldboy = new(oldboy)
    three := oldboy{1, "three"}
    four := oldboy{}
    five := &oldboy{}
    six := &oldboy{2, "six"} //同 var six *oldboy = &oldboy{2, "six"}

    fmt.Println(one, two, three, four, five, six)
}

one three four 返回 oldboy 類型變量;two five six 返回 *oldboy 類型變量;若無初始化值,則默認爲零值。

匿名字段

定義一個struct,定義的時候是字段名與其類型一一對應,實際上Go語言支持只提供類型,而不寫字段名的方式,也就是匿名字段,或稱爲嵌入字段。

當匿名字段是一個struct的時候,那麼這個struct所擁有的所有字段都被隱式地引入了當前定義的這個struct。

package main

import (
    "fmt"
)

type Person struct {
    name string
    age  int
    addr string
}

type Employee struct {
    Person //匿名字段
    salary int
    int           //用內置類型做爲匿名字段
    addr   string //相似於重載
}

func main() {
    em1 := Employee{
        Person{"oldboy", 18, "北京"},
        10,
        100,
        "首都",
    }
    fmt.Println(em1)
    var em2 Person = em1.Person 
    fmt.Println(em2)
}

struct與tag應用

聲明struct結構的時候,在屬性的右側用小米點括起來的內容叫標籤(Tag),在轉換成其它數據格式的時候,會使用其中特定的字段做爲鍵值。例如轉成json格式,實例以下:

package main

import (
    "encoding/json"
    "fmt"
)

type User struct {
    UserId   int
    UserName string
}
type UserTag struct {
    UserId   int    `json:"user_id" bson:"user_id"`
    UserName string `json:"user_name" bson:"user_name"`
}

func main() {
    user := &User{UserId: 1, UserName: "oldboy"}
    json_user, _ := json.Marshal(user)
    fmt.Printf("struct User echo : %v\n", string(json_user))

    user_tag := &UserTag{UserId: 1, UserName: "oldboy"}
    json_user_tag, _ := json.Marshal(user_tag)
    fmt.Printf("struct UserTag echo : %v\n", string(json_user_tag))
}

運行結果:

struct User echo : {"UserId":1,"UserName":"oldboy"}
struct UserTag echo : {"user_id":1,"user_name":"oldboy"}

標籤是struct類型的組成部分:

package main

var user1 struct {
    UserId int `json:"user_id"`
}
var user2 struct {
    UserId int `bson:"user_id"`
}

func main() {
    user1 = user2
}

編譯錯誤:

./main.go:11:8: cannot use user2 (type struct { UserId int "bson:\"user_id\"" }) as type struct { UserId int "json:\"user_id\"" } in assignment
相關文章
相關標籤/搜索