目录
结构体
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