Go语言结构体,struct

Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。

结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。

结构体表示一项记录,比如保存图书馆的书籍记录,每本书有以下属性:

  1. title   :书名
  2. author   :作者
  3. address :地址
  4. mobile :手机号
  5. publisher :出版社

定义结构体

结构体定义需要使用 type 和 struct 语句。struct 语句定义一个新的数据类型,结构体有中一个或多个成员。type 语句设定了结构体的名称。结构体的格式如下:

type struct_name struct{
     struct_field_name  type
     ..........
}    

一旦定义了结构体类型,它就能用于变量的声明,语法格式如下:

两种声明的方法:

variable_name := struct_name{sturct_field_name:value,.....} 

variable_name := struct_name{}
variable_name.struct_filed_name = value
.......

访问结构体成员

如果要访问结构体成员,需要使用点号 (.) 操作符,格式为:"结构体.成员名"。

结构体类型变量使用struct关键字定义,实例如下:

 1 package main
 2 
 3 import (
 4     "fmt"
 5 )
 6 
 7 //结构体
 8 type Books struct {
 9     //结构体中的字段及字段对应的数据类型
10     title         string
11     author          string
12     address     string
13     mobile        int8
14     publisher    string
15 
16 }
17 
18 func main(){
19     //实例化结构体并赋值,用的第一种方法
20     book1 := Books{title:"小陈的幸福生活~",author:"小陈",address:"东京有点热",mobile:110,publisher:"日本????"}
21     //实例化结构体并赋值,分别给每个字段赋值
22     book2 := Books{}
23     book2.title = "小兔子要搞事情"
24     book2.author = "帅兔子~"
25     book2.address = "中国~日本省"
26     book2.mobile = 110
27     book2.publisher = "????"
28 
29     //打印赋值以后的信息
30     fmt.Printf("book title      %s \n", book1.title)
31     fmt.Printf("book author     %s \n", book1.author)
32     fmt.Printf("book address    %s \n", book1.address)
33     fmt.Printf("book mobile     %d \n", book1.mobile)
34     fmt.Printf("book publisher  %s \n", book1.publisher)
35 
36     fmt.Println("-----------------------------------")
37 
38     fmt.Printf("book title      %s \n", book2.title)
39     fmt.Printf("book author     %s \n", book2.author)
40     fmt.Printf("book address    %s \n", book2.address)
41     fmt.Printf("book mobile     %d \n", book2.mobile)
42     fmt.Printf("book publisher  %s \n", book2.publisher)
43 }

以上代码运行执行结果:

book title      小陈的幸福生活~ 
book author     小陈 
book address    东京有点热 
book mobile     110 
book publisher  日本???? 
-----------------------------------
book title      小兔子要搞事情 
book author     帅兔子~ 
book address    中国~日本省 
book mobile     110 
book publisher  ???? 

结构体作为函数参数

你可以向其他数据类型一样将结构体类型作为参数传递给函数。并以以上实例的方式访问结构体变量:

 1 package main
 2 
 3 import (
 4     "fmt"
 5 )
 6 
 7 //结构体
 8 type Books struct {
 9     //结构体中的字段及字段对应的数据类型
10     title         string
11     author          string
12     address     string
13     mobile        int8
14     publisher    string
15 
16 }
17 
18 //用于打印结构体的自定义函数
19 func printBook(book Books){
20     fmt.Printf("book title      %s \n", book.title)
21     fmt.Printf("book author     %s \n", book.author)
22     fmt.Printf("book address    %s \n", book.address)
23     fmt.Printf("book mobile     %d \n", book.mobile)
24     fmt.Printf("book publisher  %s \n", book.publisher)
25     fmt.Println("------------------------------------")
26 
27 }
28 
29 func main(){
30     //实例化结构体并赋值,用的第一种方法
31     book1 := Books{title:"小陈的幸福生活~",author:"小陈",address:"东京有点热",mobile:110,publisher:"日本????"}
32     //实例化结构体并赋值,分别给每个字段赋值
33     book2 := Books{}
34     book2.title = "小兔子要搞事情"
35     book2.author = "帅兔子~"
36     book2.address = "中国~日本省"
37     book2.mobile = 110
38     book2.publisher = "????"
39 
40     //打印赋值以后的信息
41     printBook(book1)
42     printBook(book2)
43 }

以上代码运行执行结果:

book title      小陈的幸福生活~ 
book author     小陈 
book address    东京有点热 
book mobile     110 
book publisher  日本???? 
------------------------------------
book title      小兔子要搞事情 
book author     帅兔子~ 
book address    中国~日本省 
book mobile     110 
book publisher  ???? 
------------------------------------

结构体指针

你可以定义指向结构体的指针类似于其他指针变量,格式如下:

var struct_pointer *Books

以上定义的指针变量可以存储结构体变量的地址。查看结构体变量地址,可以将 & 符号放置于结构体变量前:

struct_pointer = &book;

使用结构体指针访问结构体成员,使用 "." 操作符:

struct_pointer.title;

接下来让我们使用结构体指针重写以上实例,代码如下:

 1 package main
 2 
 3 import (
 4     "fmt"
 5 )
 6 
 7 //结构体
 8 type Books struct {
 9     //结构体中的字段及字段对应的数据类型
10     title         string
11     author          string
12     address     string
13     mobile        int64
14     publisher    string
15 
16 }
17 
18 //用于打印结构体的自定义函数
19 func printBook(book *Books){
20     fmt.Printf("book title      %s \n", book.title)
21     fmt.Printf("book author     %s \n", book.author)
22     fmt.Printf("book address    %s \n", book.address)
23     fmt.Printf("book mobile     %d \n", book.mobile)
24     fmt.Printf("book publisher  %s \n", book.publisher)
25     fmt.Println("------------------------------------")
26 
27 }
28 
29 func main(){
30     //实例化结构体并赋值,分别给每个字段赋值
31     book := Books{}
32     book.title = "Golang大战Python"
33     book.author = "来自火星的大佬~"
34     book.address = "可能是来自火星的吧~"
35     book.mobile = 13843811011
36     book.publisher = "????"
37 
38     //打印赋值以后的信息
39     printBook(&book)
40 }

以上代码运行执行结果:

book title      olang大战Python 
book author     来自火星的大佬~ 
book address    可能是来自火星的吧~ 
book mobile     13843811011 
book publisher  ???? 
------------------------------------