五、Go的数组和结构体

1.数组

数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形、字符串或者自定义类型。

声明数组

var balance [10] float32

初始化数组

var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

//或者用...表示不限制大小,根据后面的{}的元素个数自动设置

var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

多维数组

var threedim [5][10][4]int

向函数传递数组

方式一

形参设定数组大小:

void myFunction(param [10]int)
{
// dosomething
}

方式二

形参未设定数组大小:

void myFunction(param []int)
{
// dosomething
}

2.结构体

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

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

声明结构体:

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

如:

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 或 空
   fmt.Println(Books{title: "Go 语言", author: "www.runoob.com"})
}

访问结构体成员:

结构体.成员名
Books1.titleGo 语言

结构体作为函数参数:

像其他数据类型一样将结构体类型作为参数传递给函数。

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);
}
//可以输出每个结构体的title及其取值。

结构体指针:

可以像其他指针变量一样定义结构体的指针变量。

var struct_pointer *Books

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

struct_pointer = &Book1;

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

struct_pointer.title;