1结构体概述
Go语言的结构体是一种聚合的数据类型,由一系列具体相同或不同类型的数据构成的数据集合。
2.结构体初始化
2.1普通变量初始化
创建方式 | 操作 | 说明 |
顺序初始化 | 按结构体变量顺序依次赋值。 | 用顺序初始化的方式初始化,每个成员都必须初始化 |
部分成员初始化 | 仅对结构体类型的部分成员进行赋值 | 没被初始化的成员,会自动取零值。 |
package main
import "fmt"
type classMessage struct {
className string
number int
maleNumber int
femaleNumber int
}
func main() {
/*1.顺序初始化必须每个成员都初始化*/
var c1 classMessage = classMessage{"高一(一)班", 50, 25, 25}
fmt.Println("c1 =", c1)
c2 := classMessage{"高二(三)班", 51, 25, 26}
fmt.Println("c2 =", c2)
/*顺序初始化,还有成员没有被赋值,报错*/
//c3 := classMessage{"高二(一)班", 51, 20}
/*2.指定初始化某个成员,没有初始化的成员,自动取得零值*/
c4 := classMessage{className: "高一(一)班", number: 50, maleNumber: 50}
fmt.Println("c4 =", c4)
/*指定初始化某个成员时,可以不按照顺序赋值,单打印结果会按照结构类型变量顺序打印*/
c5 := classMessage{number: 50, className: "高一(一)班", maleNumber: 50}
fmt.Println("c5 =", c5)
}
2.2指针变量初始化
package main
import "fmt"
type classMessage struct {
className string
number int
maleNumber int
femaleNumber int
}
func main() {
/*1.顺序初始化必须每个成员都初始化*/
var c1 *classMessage = &classMessage{"高一(一)班", 50, 25, 25}
fmt.Println("8c1 =", *c1)
c2 := &classMessage{"高二(三)班", 51, 25, 26}
fmt.Println("*c2 =", *c2)
/*顺序初始化,还有成员没有被赋值,报错*/
//c3 := &classMessage{"高二(一)班", 51, 20}
/*2.指定初始化某个成员,没有初始化的成员,自动取得零值*/
c4 := &classMessage{className: "高一(一)班", number: 50, maleNumber: 50}
fmt.Println("*c4 =", *c4)
/*指定初始化某个成员时,可以不按照顺序赋值,单打印结果会按照结构类型变量顺序打印*/
c5 := &classMessage{number: 50, className: "高一(一)班", maleNumber: 50}
fmt.Println("*c5 =", *c5)
}
3.匿名字段
创建的结构体里的字段只有类型,没有字段名,这样的字段被成为匿名字段。
虽然匿名字段没有名称,但本质上是以类型名为名称的字段。
package main
import "fmt"
type classMessage struct {
string
int
}
func main() {
c1 := classMessage{"高一(一)班", 50}
fmt.Println("c1 =", c1)
var c2 classMessage
c2.string = "高二(二)班"
c2.int = 30
fmt.Println("c2 =", c2)
}
4结构体成员的调用
4.1普通变量的调用
调用结构体变量的成员, 需要用点操作符".",即:结构体变量名.成员名。
package main
import "fmt"
type classMessage struct {
className string
number int
maleNumber int
femaleNumber int
}
func main() {
/*1.打印结构体成员变量*/
c1 := classMessage{"高一(一)班", 50, 25, 25}
fmt.Printf("className=%s,number=%d,maleNumber=%d,femaleNumber=%d\n", c1.className, c1.number, c1.maleNumber, c1.femaleNumber)
/*2.对结构体成员变量赋值或修改*/
var c2 classMessage
c2.className = "高三(一)班"
c2.number = 45
c2.maleNumber = 45
fmt.Printf("c2=%v\n", c2)
fmt.Printf("c2=%+v\n", c2)
c2.className = "高三(二)"
fmt.Printf("c2=%+v\n", c2)
}
4.2指针变量成员的调用
对指针变量的成员调用方式有两种:
调用方式 | 说明 |
结构体变量名.成员名 | 调用的指针变量成员,可以赋值,也可以修改其值 |
(*结构体变量名).成员名 |
package main
import "fmt"
type classMessage struct {
className string
number int
maleNumber int
femaleNumber int
}
func main() {
/*1.打印结构体成员变量*/
c1 := &classMessage{"高一(一)班", 50, 25, 25}
fmt.Printf("className=%s,number=%d,maleNumber=%d,femaleNumber=%d\n",
(*c1).className, (*c1).number, (*c1).maleNumber, (*c1).femaleNumber)
/*2.对结构体成员变量赋值或修改*/
c2 := new(classMessage)
c2.className = "高三(一)班"
(*c2).number = 45
c2.maleNumber = 45
fmt.Printf("c2=%v\n", *c2)
fmt.Printf("c2=%+v\n", *c2)
c2.className = "高三(二)"
fmt.Printf("c2=%+v\n", *c2)
}
5.结构体变量的比较和赋值
5.1结构体变量的比较
a.结构体变量可以使用"=="或"!="运算符比较,但不支持">"或"<"。
b.当两个结构体变量的类型相同,想要的成员值相等,这两个结构体变量相等。
package main
import "fmt"
type classMessage struct {
className string
number int
maleNumber int
femaleNumber int
}
func main() {
c1 := classMessage{"高二(一)班", 50, 25, 25}
c2 := classMessage{"高二(一)班", 50, 25, 25}
c3 := classMessage{"高二(一)班", 70, 25, 25}
fmt.Println(c1 == c2) //类型相同成员值相等
fmt.Println(c1 != c3) //类型相同,成员值不相等
}
5.2结构体变量的赋值
两个结构体变量类型相同,这两个变量可以互相赋值。
package main
import "fmt"
type classMessage struct {
className string
number int
maleNumber int
femaleNumber int
}
func main() {
c1 := classMessage{"高二(一)班", 50, 25, 25}
c2 := classMessage{"高二(一)班", 70, 25, 25}
c2 = c1
var c3 classMessage
c3 = c1
fmt.Println("c1 = ", c1)
fmt.Println("c2 = ", c2)
fmt.Println("c3 = ", c3)
}
6.结构体变量作为函数参数
6.1值传递
不会影响实参的值。
package main
import "fmt"
type classMessage struct {
className string
number int
maleNumber int
femaleNumber int
}
func test(c classMessage) {
c.number = 100
fmt.Println("test:c = ", c)
}
func main() {
c1 := classMessage{"高二(一)班", 50, 25, 25}
test(c1)
fmt.Println("main:c1 = ", c1)
}
6.2引用传递
实参的值也发生改变
package main
import "fmt"
type classMessage struct {
className string
number int
maleNumber int
femaleNumber int
}
func test(c classMessage) {
c.number = 100
fmt.Println("test:c = ", c)
}
func main() {
c1 := classMessage{"高二(一)班", 50, 25, 25}
test(c1)
fmt.Println("main:c1 = ", c1)
}