定义
数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。
结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。类似Java 的类, 但struct中的成员不能是方法,只可以是变量 ,我们可以把Go中的struct看作是不支持继承行为的轻量级的“类”。
举例
结构体表示一项记录,比如保存图书馆的书籍记录,每本书有以下属性:
结构体定义需要使用 type 和 struct 语句。struct 语句定义一个新的数据类型,结构体有中有一个或多个成员。type 语句设定了结构体的名称。
type Books struct {
title string
author string
subject string
book_id int
}
func main() {
var Book1 Books /* 声明 Book1 为 Books 类型 */
/* book 1 描述 */
Book1.title = "Go 语言"
Book1.author = "zhangsan"
Book1.subject = "Go 语言教程"
Book1.book_id = 123456
/* 作为参数传递给函数 ,打印 Book1 信息 */
printBook(Book1)
// 创建一个新的结构体
fmt.Println(Books{"Go 语言", "zhangsan", "Go 语言教程", 123456})
// 也可以使用 key => value 格式
fmt.Println(Books{title: "Go 语言", author: "zhangsan", subject: "Go 语言教程", book_id: 123456})
// 忽略的字段为 0 或 空
fmt.Println(Books{title: "Go 语言", author: "zhangsan"})
}
//结构体作为参数传入,是值传递,不会影响原来的值
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);
}
----output----
Book title : Go 语言
Book author : zhangsan
Book subject : Go 语言教程
Book book_id : 123456
{Go 语言 zhangsan Go 语言教程 123456}
{Go 语言 zhangsan Go 语言教程 123456}
{Go 语言 zhangsan 0}
结构体指针
既然结构体做参数传入函数中是值传递,那么在利用指针时,就可以修改原结构体的数据了
func main() {
var book Books
book.title = "Go语言"
demo(&book)
fmt.Printf( "Book title : %s\n", book.title);
}
func demo(book *Books) {
book.title = "Java 语言"
fmt.Printf( "Book title : %s\n", book.title);
}
---output----
Book title : Java 语言
Book title : Java 语言
定义好一个结构体后,我们要怎么创建并初始化一个结构体对象实例呢?
有以下几种方式
func main() {
book1 := new(Books) //声明一个所有字段均为默认值的对象实例
book2 := &Books{"Go语言","zhangsan","computer",1}//指明对象实例的字段值
book3 := &Books{}//声明一个所有字段均为默认值的对象实例
fmt.Println("book1: ",book1)
fmt.Println("book2: ",book2)
fmt.Println("book3: ",book3)
}
----output----
book1: &{ 0}
book2: &{Go语言 zhangsan computer 1}
book3: &{ 0}
结构体我们定义好了,对象也创建了,那么我们可以通过构造函数创建特定的对象吗?
Go语言中并没有构造函数的概念,对象的创建往往通过一个全局的函数创建,函数名一般叫做:NewXXX命名
//自定义全局构造函数
func NewBooks(title,author,subject string,book_id int) *Books {
return &Books{title,author,subject,book_id}
}