Go 語言編程 — 高級數據類型 — 結構體

目錄

結構體

Golang 中,結構體是由一系列具有相同類型或不同類型的數據構成的數據集合。

結構體的定義使用了 type 和 struct 關鍵字。

  • struct 關鍵字:定義一個新的數據類型,結構體中有一個或多個成員。
  • type 關鍵字:設定了結構體的名稱。

結構體的格式如下:

type struct_variable_type struct {
   member definition
   member definition
   ...
   member definition
}

一旦定義了結構體類型,它就能用於變量的聲明,與聲明基礎數據類型的變量無異。

格式:

variable_name := structure_variable_type {value1, value2...valuen}
// or
variable_name := structure_variable_type { key1: value1, key2: value2..., keyn: valuen}

示例:

package main

import "fmt"

type Books struct {
    title string
    author string
    subject string
    book_id int
}

func main() {

    // 創建一個新的結構體
    fmt.Println(Books{"Go 語言", "www.runoob.com", "Go 語言教程", 6495407})

    // 也可以使用 key => value 格式
    fmt.Println(Books{title: "Go 語言", author: "www.runoob.com", subject: "Go 語言教程", book_id: 6495407})

    // 忽略初始化的成員爲 0 或 nil
    fmt.Println(Books{title: "Go 語言", author: "www.runoob.com"})
}

訪問結構體成員

使用 . 成員訪問符,來訪問結構體的成員。

package main

import "fmt"

type Books struct {
   title string
   author string
   subject string
   book_id int
}

func main() {
   var Book1 Books        /* 聲明 Book1 爲 Books 類型 */
   var Book2 Books        /* 聲明 Book2 爲 Books 類型 */

   /* book 1 描述 */
   Book1.title = "Go 語言"
   Book1.author = "www.runoob.com"
   Book1.subject = "Go 語言教程"
   Book1.book_id = 6495407

   /* book 2 描述 */
   Book2.title = "Python 教程"
   Book2.author = "www.runoob.com"
   Book2.subject = "Python 語言教程"
   Book2.book_id = 6495700

   /* 打印 Book1 信息 */
   fmt.Printf( "Book 1 title : %s\n", Book1.title)
   fmt.Printf( "Book 1 author : %s\n", Book1.author)
   fmt.Printf( "Book 1 subject : %s\n", Book1.subject)
   fmt.Printf( "Book 1 book_id : %d\n", Book1.book_id)

   /* 打印 Book2 信息 */
   fmt.Printf( "Book 2 title : %s\n", Book2.title)
   fmt.Printf( "Book 2 author : %s\n", Book2.author)
   fmt.Printf( "Book 2 subject : %s\n", Book2.subject)
   fmt.Printf( "Book 2 book_id : %d\n", Book2.book_id)
}

向函數傳遞結構體

你可以像其他數據類型一樣將結構體類型變量作爲參數傳遞給函數,結構體是作爲實參時採用的是值傳遞。

package main

import "fmt"

type Books struct {
   title string
   author string
   subject string
   book_id int
}

func main() {
    var Book1 Books        /* 聲明 Book1 爲 Books 類型 */
    var Book2 Books        /* 聲明 Book2 爲 Books 類型 */

    /* book 1 描述 */
    Book1.title = "Go 語言"
    Book1.author = "www.runoob.com"
    Book1.subject = "Go 語言教程"
    Book1.book_id = 6495407

    /* book 2 描述 */
    Book2.title = "Python 教程"
    Book2.author = "www.runoob.com"
    Book2.subject = "Python 語言教程"
    Book2.book_id = 6495700

    /* 打印 Book1 信息 */
    printBook(Book1)

    /* 打印 Book2 信息 */
    printBook(Book2)
}

func printBook(book Books) {
    fmt.Printf( "Book title : %s\n", book.title)
    fmt.Printf( "Book author : %s\n", book.author)
    fmt.Printf( "Book subject : %s\n", book.subject)
    fmt.Printf( "Book book_id : %d\n", book.book_id)
}

結構體指針

相對的,將結構體指針作爲函數實參傳入時,肯定是引用語義的。

聲明結構體指針類型變量:

var struct_pointer *Books
struct_pointer = &Book1

Golang 中訪問結構體指針類型變量的成員依然是使用成員訪問符 .,而不像 C 語言那樣會有特殊的地址訪問符 ->

struct_pointer.title

示例:

package main

import "fmt"

type Books struct {
    title string
    author string
    subject string
    book_id int
}

func main() {
    var Book1 Books        /* Declare Book1 of type Book */
    var Book2 Books        /* Declare Book2 of type Book */

    /* book 1 描述 */
    Book1.title = "Go 語言"
    Book1.author = "www.runoob.com"
    Book1.subject = "Go 語言教程"
    Book1.book_id = 6495407

    /* book 2 描述 */
    Book2.title = "Python 教程"
    Book2.author = "www.runoob.com"
    Book2.subject = "Python 語言教程"
    Book2.book_id = 6495700

    /* 打印 Book1 信息 */
    printBook(&Book1)

    /* 打印 Book2 信息 */
    printBook(&Book2)
}

func printBook(book *Books) {
    fmt.Printf( "Book title : %s\n", book.title)
    fmt.Printf( "Book author : %s\n", book.author)
    fmt.Printf( "Book subject : %s\n", book.subject)
    fmt.Printf( "Book book_id : %d\n", book.book_id)
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章