Golang的高級數據類型-結構體(struct)實戰篇


        Golang的高級數據類型-結構體(struct)實戰篇

                             作者:尹正傑

版權聲明:原創作品,謝絕轉載!否則將追究法律責任。

 

 

   前面我們介紹了數組,切片,map同名都是用來保存相同的數據類型的,那如果我們想要一種數據類型保存不同類型的數據咋辦呢?Go語言在結構體中可以為不同項定義不同的數據類型。

 

一.定義結構體

package main

import (
    "fmt"
)

/*
    我們定義一個變量后不使用運行會報錯,但定義結構體類型后可以不使用,在執行時並不會報錯,因為你不對結構體進行初始化操作它並不占用內存空間.
*/
type Teacher struct {
    Name string
    Age  uint8
}

/*
    溫馨提示:
        Go語言中結構體的字段首字母如果小寫的話不能跨包訪問,如果首字母大寫則可以跨包訪問.

    如下所示,我們可以自定義一個全局類型的Student結構體類型
*/
type Student struct {
    Name   string
    Age    uint8
    Gender rune
}

func main() {
    //初始化一個結構體
    var s1 Student
    s1.Name = "尹正傑"
    s1.Age = 18
    fmt.Println("s1 = ", s1)

    //我們也可以在聲明變量的時候定義結構體類型,只不過我們實在main函數聲明的,因此是一個局部變量
    var s2 struct {
        Name  string
        Score int
    }
    s2.Name = "Jason Yin"
    s2.Score = 750
    fmt.Println("s2 = ", s2)

    //我們可以直接進行初始化賦值
    s3 := Student{Name: "Yinzhengjie", Age: 27, Gender: ''}
    s4 := Student{"尹正傑", 27, ''} //可以省略字段名稱但順序一定不能錯
    fmt.Println("s3 = ", s3)
    fmt.Println("s4 = ", s4)
}

  

二.結構體的基本使用

1>.結構體的訪問方式

package main

import (
    "fmt"
)

/*
    溫馨提示:
        (1)結構體中的字段一旦定義就不會發生改變;
        (2)結構體沒有增加或者刪除字段的操作;
        (3)在main函數中調用其它文件的成員,在編譯運行的時候,必須手動指定編譯的文件;

*/
type Person struct {
    Name string
    Age  uint8
}

func main() {

    //對自定義的結構體進行初始化賦值
    s := Person{"尹正傑", 18}

    fmt.Println(s)

    //我們可以單獨訪問結構體的元素
    fmt.Printf("姓名:%s,年齡:%d\n", s.Name, s.Age)
}

2>.結構體和切片結合使用

package main

import (
    "fmt"
)

type Operation struct {
    Name string
    Age  uint8
}

func main() {
    //使用自動推導類型直接進行初始化賦值
    op := Operation{"尹正傑", 18}
    fmt.Println("op的數據為:", op)

    //定義一個結構體切片
    var s1 []Operation

    //對結構體切片進行初始化
    s1 = make([]Operation, 3)

    fmt.Print("s1結構體初始化值為:")
    fmt.Println(s1)
    //對結構體切片第二個元素進行賦值
    s1[1] = op
    //我們可以對結構體切片的元素對應的屬性進行修改操作
    s1[1].Name = "Jason Yin"
    fmt.Print("s1結構體被修改后的值為:")
    fmt.Println(s1)
}

3>.結構體和字典(map)結合使用

package main

import (
    "fmt"
)

type Server struct {
    brand       string //品牌
    CpuCore     uint8  //核心數
    MemorySpace int    //內存空間,單位為GB
    DiskSpace   int    //磁盤空間,單位為GB
}

func main() {
    //使用自動推導類型直接進行初始化賦值
    s1 := Server{"戴爾", 32, 128, 122880}

    //定義一個字典
    m1 := make(map[string]Server)

    //結構體對象作為map的value
    m1["亦庄機房"] = s1
    fmt.Println(m1["亦庄機房"].brand)
    fmt.Println(m1)

    /*
       如果map的value是結構體類型,那么不能直接通過map修改結構體中的數據,這個時候結構體的內容是只讀的.
       如果非要修改map的value是結構體類型,需要先對結構體進行修改,然后再重新賦值
    */
    //m1["亦庄機房"].brand = "浪潮" //這種寫法是錯誤的
    s1.brand = "浪潮" //先修改s1結構體的brand字段
    m1["亦庄機房"] = s1 //再對同一個key進行賦值,完成更新操作
    fmt.Println(m1["亦庄機房"].brand)
    fmt.Println(m1)
}

 

 三.結構體對象作為函數參數傳遞

package main

import "fmt"

type Car struct {
    Name  string
    color string
    tyre  int8
}

func Demo(c Car) {
    c.color = "紅色"
    fmt.Println("in Demo ...", c)
}

func main() {

    d1 := Car{"特斯拉", "藍色", 4}
    fmt.Println("in main ...", d1)

    /*
        結構體對象作為函數參數,是值傳遞
    */
    Demo(d1)

    fmt.Println("in main ...", d1)
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM