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)
}