Go 结构体
Go数组允许您定义可以容纳相同类型的多个数据项的变量。 结构体 是Go编程中另一种可用的用户定义数据类型,它允许您组合不同类型的数据项。
结构体用于表示一条记录。假设您想要跟踪图书馆中的书籍。您可能想要跟踪每本书的以下属性:
- Title
- Author
- Subject
- Book ID
在这种情况下,结构体非常有用。
定义结构体
要定义一个结构体,您必须使用 type 和 struct 语句。struct语句定义了一个新的数据类型,其程序具有多个成员。type语句将名称与类型绑定在一起,这在我们的情况中是struct。struct语句的格式如下所示:
type struct_variable_type struct {
member definition;
member definition;
...
member definition;
}
一旦定义了结构类型,就可以使用以下语法来声明该类型的变量。
variable_name := structure_variable_type {value1, value2...valuen}
访问结构成员
为了访问结构的任何成员,我们使用 成员访问运算符(.) 。该成员访问运算符编码为在结构变量名和我们希望访问的结构成员之间的句号。您可以使用 struct 关键字来定义结构类型的变量。下面的示例解释了如何使用结构:
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 specification */
Book1.title = "Go Programming"
Book1.author = "Mahesh Kumar"
Book1.subject = "Go Programming Tutorial"
Book1.book_id = 6495407
/* book 2 specification */
Book2.title = "Telecom Billing"
Book2.author = "Zara Ali"
Book2.subject = "Telecom Billing Tutorial"
Book2.book_id = 6495700
/* print Book1 info */
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)
/* print Book2 info */
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)
}
在上面的代码被编译和执行时,会产生以下结果−
Book 1 title : Go Programming
Book 1 author : Mahesh Kumar
Book 1 subject : Go Programming Tutorial
Book 1 book_id : 6495407
Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700
结构体作为函数参数
您可以将结构体作为函数参数传递,方式与传递其他变量或指针非常相似。您可以像在上面的示例中那样访问结构体变量-
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 specification */
Book1.title = "Go Programming"
Book1.author = "Mahesh Kumar"
Book1.subject = "Go Programming Tutorial"
Book1.book_id = 6495407
/* book 2 specification */
Book2.title = "Telecom Billing"
Book2.author = "Zara Ali"
Book2.subject = "Telecom Billing Tutorial"
Book2.book_id = 6495700
/* print Book1 info */
printBook(Book1)
/* print Book2 info */
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);
}
当上述代码被编译并执行时,会产生以下结果−
Book title : Go Programming
Book author : Mahesh Kumar
Book subject : Go Programming Tutorial
Book book_id : 6495407
Book title : Telecom Billing
Book author : Zara Ali
Book subject : Telecom Billing Tutorial
Book book_id : 6495700
指向结构体的指针
您可以像定义指向其他变量的指针一样定义指向结构体的指针,具体如下所示−
var struct_pointer *Books
现在,您可以将结构变量的地址存储在上面定义的指针变量中。要找到结构变量的地址,在结构的名称前放置 & 运算符,如下所示−
struct_pointer = &Book1;
使用指向该结构体的指针访问结构体成员时,必须使用” . “运算符,如下所示 –
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 specification */
Book1.title = "Go Programming"
Book1.author = "Mahesh Kumar"
Book1.subject = "Go Programming Tutorial"
Book1.book_id = 6495407
/* book 2 specification */
Book2.title = "Telecom Billing"
Book2.author = "Zara Ali"
Book2.subject = "Telecom Billing Tutorial"
Book2.book_id = 6495700
/* print Book1 info */
printBook(&Book1)
/* print Book2 info */
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);
}
当上述代码被编译和执行时,会产生以下结果−
Book title : Go Programming
Book author : Mahesh Kumar
Book subject : Go Programming Tutorial
Book book_id : 6495407
Book title : Telecom Billing
Book author : Zara Ali
Book subject : Telecom Billing Tutorial
Book book_id : 6495700