結構體
相比于Java,在Go語言中沒有類的概念,但是多了結構體。結構體與Java中的類很像,是表示一系列同一類型或不同類型的資料構成的資料集合。
例如可以将學醬油象成一個結構體,每一個學生有以下屬性:
Name:姓名
Age:年齡
Gender:性别
Grade:年級
那麼以上的所有屬性就組成了一個結構體,這個結構體可以命名為Student。
結構體定義
在使用結構體時首先需要對結構體進行定義,定義結構體需要使用到關鍵字
type
和
struct
,文法如下:
type 結構體名稱 struct {
成員名 成員類型
}
Student結構體代碼示例:
// 定義一個Student結構體
type Student struct {
Name string
Age int
Gender string
Grade string
}
如上所示,就定義了一個Student結構體,在這個結構體中有Name、Age等成員變量。
結構體聲明
在聲明結構體時可以直接指定結構體中成員變量的值。
代碼示例:
package main
import "fmt"
func main() {
// 1
stu1 := Student{"張三", 18, "男", "大一"}
// 2
stu2 := Student{
Name: "李四",
Age: 20,
Gender: "女",
Grade: "大三",
}
// 3
stu3 := Student{}
fmt.Println(stu1)
fmt.Println(stu2)
fmt.Println(stu3)
}
// 定義結構體Student
type Student struct {
Name string
Age int
Gender string
Grade string
}
- 使用該方法聲明結構體直接按照結構體中成員變量的順序指定值即可,需要注意的是,這種方式給成員變量指派需要全部指派,不能隻給其中部分指派。
- 該方法使用鍵值對的形式給成員變量指派,可以隻給指定的成員變量指派,其他沒有指派的則為預設值。
- 該方法隻聲明了一個結構體,沒有給成員變量指派,則結構體中所有變量均為預設值。
運作結果:
通路結構體成員
在上述的代碼中,都是直接輸出整個結構體,如果需要通路到結構體中的某一個成員變量,或者改變已經聲明好的某個成員變量的值,就需要使用到
.
操作符。
代碼示例:
package main
import "fmt"
func main() {
// 聲明結構體并指派
stu := Student{"張三", 18, "男", "大一"}
// 列印結構體的值
fmt.Println("學生姓名:", stu.Name)
fmt.Println("學生年齡:", stu.Age)
fmt.Println("學生性别:", stu.Gender)
fmt.Println("學生年級:", stu.Grade)
// 修改結構體中的值
stu.Name = "李四"
stu.Age = 19
stu.Gender = "女"
stu.Grade = "大二"
// 列印修改後的結構體的值
fmt.Println("-----------------")
fmt.Println("學生姓名:", stu.Name)
fmt.Println("學生年齡:", stu.Age)
fmt.Println("學生性别:", stu.Gender)
fmt.Println("學生年級:", stu.Grade)
}
// 定義結構體Student
type Student struct {
Name string
Age int
Gender string
Grade string
}
運作結果:
如上所示,使用
.
操作符可以很友善的通路或者修改結構體中的某一個成員變量。
方法
在之前的文章中學習過go語言中的函數,其實在go語言中既有函數又有方法,方法就是規定了接受者的函數,接受者就是在函數名稱前面多了一個參數,表示将該方法綁定到這個參數對應的類型上,綁定之後該方法就隻能被這個參數對應的類型的變量才能夠調用。
如果有以下方法,該方法就隻能Student類型的變量才能夠調用,調用方式為
變量名.方法名
。
func (stu Student) print() {
// 方法體
}
代碼示例:
package main
import "fmt"
func main() {
// 聲明結構體并指派
stu := Student{"張三", 18, "男", "大一"}
stu.print()
}
type Student struct {
Name string
Age int
Gender string
Grade string
}
func (stu Student) print() {
fmt.Println("姓名", stu.Name)
fmt.Println("年齡", stu.Age)
fmt.Println("性别", stu.Gender)
fmt.Println("年級", stu.Grade)
}
在上述代碼中定義了一個print方法,該方法的接受者為Student類型,則該方法與Student類型綁定,也就隻能Student類型的變量才能夠調用,是以在main中使用
stu.print()
調用該方法不會有問題,但是在main中無法直接調用該方法,并且使用stu調用該方法時,在方法内部可以拿到stu的成員變量的值。
運作結果:
結構體指針
結構體作為一種類型,同樣有其對應的指針類型,例如上述例子中的結構體Student,就有其對應的指針類型
*Student
,可聲明一個指針用于存儲結構體變量的位址。
var stuPointer *Student
然後将結構體類型變量的位址通過取位址符
&
取出指派給指針
stuPointer
。
stuPointer = &stu
在使用結構體指針時,同樣可以使用
.
操作符通路結構體内部的成員變量。
代碼示例:
package main
import "fmt"
func main() {
// 聲明結構體并指派
stu := Student{"張三", 18, "男", "大一"}
// 定義結構體指針
var stuPointer *Student
// 将結構體位址指派給指針
stuPointer = &stu
// 結構體指針通過點(.)操作符通路成員變量
fmt.Println("姓名:", stuPointer.Name)
fmt.Println("年齡:", stuPointer.Age)
fmt.Println("性别:", stuPointer.Gender)
fmt.Println("年級:", stuPointer.Grade)
}
type Student struct {
Name string
Age int
Gender string
Grade string
}
運作結果:
同樣可以使用結構體指針加
.
操作符修改成員變量。