Go 语言编程 — 高级数据类型 — 结构体

目录

结构体

Golang 中,结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。与 C 语言中的结构体类似,区别在于 Golang 结构体的操作更加精简,方式更加单一。同时,Golang 中结构体变量也类似于 OOP 中对象的概念,可以具有对象的成员属性和成员方法。

结构体的定义使用了 type 和 struct 关键字。

  • type 关键字:设定了结构体的名称,表示定义一个新的类型(Type)。
  • struct 关键字:表示定义一个新的结构体数据类型,结构体中有一个或多个成员。

结构体的格式如下:

type struct_variable_type struct {
    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 book_s struct {
    title   string
    author  string
    subject string
    book_id int
}

func main() {
    /* 全值形式定义结构体。 */
    book1 := book_s {"Go 语言", "fanguiju", "Go 语言编程", 1}
    fmt.Println(book1)

	/* key/value 形式定义结构体。 */
    book2 := book_s {title: "Go 语言", author: "fanguiju", subject: "Go 语言编程", book_id: 1}
    fmt.Println(book2)

	/* 缺省形式定义结构体。 */
    book3 := book_s {title: "Go 语言", author: "fanguiju"}
    fmt.Println(book3)
}

结果:

{Go 语言 fanguiju Go 语言编程 1}
{Go 语言 fanguiju Go 语言编程 1}
{Go 语言 fanguiju  0}

访问结构体成员

使用 . 成员访问符,来访问结构体的成员。

package main

import "fmt"

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

func main() {
   var book1 book_s

   book1.title = "Go 语言"
   book1.author = "fanguiju"
   book1.subject = "Go 语言编程"
   book1.book_id = 1

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

结果:

Book 1 title : Go 语言
Book 1 author : fanguiju
Book 1 subject : Go 语言编程
Book 1 book_id : 1

向函数传递结构体

你可以像其他数据类型一样将结构体类型变量作为参数传递给函数,结构体是作为实参时采用的是值传递。

package main

import "fmt"

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

func print_book_infos(book book_s) {
    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)
}

func main() {
    var book1 book_s

    book1.title = "Go 语言"
    book1.author = "fanguiju"
    book1.subject = "Go 语言编程"
    book1.book_id = 1

    print_book_infos(book1)
}

结果:

Book title: Go 语言
Book author: fanguiju
Book subject: Go 语言编程
Book book_id: 1

结构体指针

相对的,将结构体指针类型变量作为函数实参传入时,肯定是引用语义的。Golang 中访问结构体指针类型变量的成员时,依然使用成员访问符 .,而不像 C 语言那样会有特殊的地址访问符 ->

示例:

package main

import "fmt"

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


func print_book_infos(book *book_s) {
    fmt.Println( "Book title: %s", book.title)
    fmt.Println( "Book author: %s", book.author)
    fmt.Println( "Book subject: %s", book.subject)
    fmt.Println( "Book book_id: %d", book.book_id)
}

func change(book *book_s) {
    book.book_id = 2
}

func main() {
    var book1 book_s

    book1.title = "Go 语言"
    book1.author = "fanguiju"
    book1.subject = "Go 语言编程"
    book1.book_id = 1
    print_book_infos(&book1)
    fmt.Println("---------")

    change(&book1)
    print_book_infos(&book1)
}

结果:

Book title: %s Go 语言
Book author: %s fanguiju
Book subject: %s Go 语言编程
Book book_id: %d 1
---------
Book title: %s Go 语言
Book author: %s fanguiju
Book subject: %s Go 语言编程
Book book_id: %d 2

猜你喜欢

转载自blog.csdn.net/Jmilk/article/details/107157286