目录
前言
数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。
结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。
结构体表示一项记录,比如班级的学生信息,每个人有以下属性:
Name :姓名 ·
Sex :性别
Age:年龄
·lD card:身份证
定义结构体
结构体定义需要使用type和struct语句。struct 语句定义一个新的数据类型,结构体中有一个或多个成员。
type语句设定了结构体的名称。结构体的格式如下:
type struct_variable_type struct {
member definition
member definition
...
member definition
}
—旦定义了结构体类型,它就能用于变量的声明,
语法格式如下:
variable_name := structure_variable_type {value1,value2. . . valuen}
或
variable_name :m structure_variable_type{ key1: value1,key2: value2.. ., keyn: valuen}
示例
package main
import "fmt"
type Person struct {
name string
sex string
age int
id_card int
}
func main{
//创建一个新的结构体
fmt.Println(Person{"zhangsan","男",20,12345678903})
//也可以使用key => value格式
fmt.Println(Person{name: "lisi" , sex: "女" ,age: 18,id_card: 6495407345})
//忽略的字段为日或空
fmt . Println(Person{name: "wangwu", sex:“未知})
}
运行结果
运行结果:
{zhangsan 男 20 1234567890}
{lisi 女 18 6495407345}
{wangwu 未知 0 0}
访问结构体成员
要访问结构体成员,需要使用点号.操作符,格式为:
结构体.成员
示例:结构体类型变量使用struct 关键字定义。
package main
import "fmt"
type Person struct {
name string
sex string
age int
id_card int
}
func main (){
var Person1 Person /*声明Person1为Persons类型*/
var Person2 Person/*声明Person2为Persons类型
/* Person 1描述*/
person1.name = "zhangsan""
Person1.sex ="男"
Person1.age = 18
Person1.id_card = 6495407335
/* Person 2描述*/
Person2.name = "lisi",
Person2.sex ="女”
Person2.age = 20
Person2.id_card = 1234567898
/*打印Person1 信息.*/
fmt.Printf("Person1 name : %s\n",Person1.name)
fmt.Printf("Person1 sex : %s\n",Person1.sex)
fmt.Printf("Person1 age : %d\n", Person1.age)
fmt .Printf("Person1 id_card : %d\n", Person1.id_card)
/*打印 Person2信息*/
fmt.Printf("Person2 name : %s\n",Person2.name)
fmt.Printf("Person2 sex : %s\n",Person2.sex)
fmt.Printf( "Person2 age : %d\n",Person2.age)
fmt .Printf("Person2 id_card : %d\n", Person2.id_card)
}
运行结果
Person 1 name : zhangsan
Person 1 sex :男
Person 1 age : 18
Person 1 id_card : 6495407335
Person 2 name : lisi
Person 2 sex :女
Person 2 age : 20
Person 2 id_card : 1234567890
结构体作为函数参数
可以像其他数据类型一样将结构体类型作为参数传递给函数。并以以上实例的方式访问结构体变量:
package main
import "fmt"
type Classinfo struct {
Name string
Age int
sex string
id_card int
}
func main() {
var (
class1 Classinfo
class2 Classinfo
)
class1.Name = "tom"
class1.Age = 23
class1.sex = "man"
class1.id_card = 13435464
class2.Name = "aili"
class2.Age = 21
class2.sex = "women"
class2.id_card = 14354655
Classinfo1(class1)
Classinfo1(class2)
}
func Classinfo1(clas Classinfo) {
fmt.Println("姓名:", clas.Name)
fmt.Println("年龄:", clas.Age)
fmt.Println("性别", clas.sex)
fmt.Println("身份证号:", clas.id_card)
}
运行结果
姓名: tom
年龄: 23
性别 man
身份证号: 13435464
姓名: aili
年龄: 21
性别 women
身份证号: 14354655
结构体指针
你可以定义指向结构体的指针类似于其他指针变量,格式如下:
var struct_pointer *Books
以上定义的指针变量可以存储结构体变量的地址。查看结构体变量地址,可以将 & 符号放置于结构体变量前:
struct_pointer = &Book1
使用结构体指针访问结构体成员,使用 "." 操作符:
struct_pointer.title
接下来让我们使用结构体指针重写以上实例,代码如下:
package main
import "fmt"
type Books struct {
title string
subject string
book_id int
}
func main() {
var Book1 Books /* 声明 Book1 为 Books 类型 */
var Book2 Books /* 声明 Book2 为 Books 类型 */
/* book 1 描述 */
Book1.title = "Go 语言"
Book1.subject = "GO"
Book1.book_id = 123456
/* book 2 描述 */
Book2.title = "Python 语言"
Book2.subject = "Python"
Book2.book_id = 456789
/* 打印 Book1 信息 */
printBook(&Book1)
/* 打印 Book2 信息 */
printBook(&Book2)
}
func printBook( book *Books ) {
fmt.Printf( "Book title : %s\n", book.title)
fmt.Printf( "Book subject : %s\n", book.subject)
fmt.Printf( "Book book_id : %d\n", book.book_id)
}
以上实例执行运行结果为:
Book title : Go 语言
Book subject : Go
Book book_id : 123456
Book title : Python 语言
Book subject : Python
Book book_id : 456789
判断结构体是值类型还是引用类型
package main
import "fmt"
//结构体声明
type Person struct {
name string
sex string
age int
id_card int
}
/*结构体定义*/
func main() {
//结构体类型的变量
var (
person1 Person
)
//给person1赋值
person1.name = "tom"
person1.sex = "man"
person1.age = 30
person1.id_card = 123456
fmt.Println("处理前:", person1)
updateInfo(&person1)
fmt.Println("处理后:", person1)
}
//函数定义结构体为形式参数进行传入
func updateInfo(per *Person) {
per.name = "jack"
}
运行结果
转化前: {tom 20 男 134353}
转化之后: {jack 21 未知 654321}
由此可知结构体是引用类型
晚安