1.结构体的定义
go语言中,结构体的声明非常类似c语言,具体定义方法如下:
初始化方法有三种:
- 顺序初始化,每个变量都必须初始化
- 部分成员初始化,未初始化的变量被赋值成0
- 结构体指针变量初始化
package main
import "fmt"
// 定义一个结构体类型
type Student struct {
id int
name string
sex byte
age int
addr string
}
func main() {
//1.顺序初始化,每个变量都必须初始化
var s1 Student = Student{1, "mike", 'm', 18, "北京"}
fmt.Println("s1 = ", s1)
//2.部分成员初始化,未初始化的变量被赋值为0
s2 := Student{name: "xiaoming", addr: "上海"}
fmt.Println("s2 = ", s2)
//3.结构体指针变量初始化
var p1 *Student = &Student{name: "lihua", addr: "广州"}
fmt.Println("*p1 = ", *p1)
//使用自动推导类型
fmt.Printf("p1 type is %T\n", p1)
}
2.结构体的比较和赋值
这里的比较和赋值类似数组的比较和赋值,只有同类型才能比较和赋值,比较只能使用==
来比较相等或不相等。
package main
import "fmt"
type Student struct {
id int
name string
sex byte
age int
addr string
}
func main() {
s1 := Student{1, "mike", 'm', 18, "bj"}
s2 := Student{1, "mike", 'm', 18, "bj"}
s3 := Student{2, "mike", 'm', 18, "bj"}
fmt.Println("s1 == s2", s1 == s2)
fmt.Println("s1 == s3", s1 == s3)
// 同类型结构体变量可以相互赋值
var tmp Student
tmp = s3
fmt.Println(tmp)
}
3.结构体成员的使用
这里对结构体成员的使用类似c语言,使用.
运算符操作。
package main
import "fmt"
type Student struct {
id int
name string
sex byte
age int
addr string
}
func main() {
var s Student
//操作成员需要使用(.)运算符
s.id = 1
s.name = "mike"
s.age = 18
s.addr = "北京"
fmt.Println("s = ", s)
}
4.结构体指针的操作
这里对结构体指针的操作并不是用->
,而是继续使用.
操作符,也就是说,假设p1为结构体指针,那么,p1.name
和(*p1).name
这两种方式完全等价。
我们还可以使用new函数来定义一个结构体,new函数返回的是一个结构体指针。
package main
import "fmt"
type Student struct {
id int
name string
sex byte
age int
addr string
}
func main() {
//1.指针有合法指向后,才能操作成员
//先定义一个普通结构变量
var s Student
var p1 *Student
p1 = &s
//go语言中没有->运算符,下面两种写法等价
p1.id = 18
(*p1).name = "mike"
p1.addr = "北京"
fmt.Println("p1 = ", p1)
// 通过new申请一个结构体
p2 := new(Student)
p2.id = 1
p2.name = "mike"
p2.age = 18
p2.sex = 'm'
p2.addr = "北京"
fmt.Println("p2 = ", p2)
}