package main
import "fmt"
// 定義結構體
type StudentMangement struct {
name string
id string
addr string
hobby []string
}
// 構造函數 一般以new開頭
// 函數返回結構體指針,可以減少內存開銷
func newStudent(name, id, addr string, hobby []string) *StudentMangement {
return &StudentMangement{
name: name,
id: id,
addr: addr,
hobby: hobby,
}
}
// 修改值
func resetId(s *StudentMangement) {
// (*s).id = "destory" // 標準方式應該這麼寫
s.id = "destory" // go 語言的語法糖,自動根據指針找對應的變量
}
// 這種情況不能修改值, 函數內是副本
func resetName(s StudentMangement) {
s.name = "resetName"
}
func resetNamePoint(s *StudentMangement) {
s.name = "resetName"
}
func main() {
xiaoMing := newStudent("XiaoMing", "2020001", "Beijing", []string{"Music"})
fmt.Println(xiaoMing) // &{XiaoMing 2020001 Beijing [Music]}
resetId(xiaoMing)
fmt.Println(xiaoMing) // &{XiaoMing destory Beijing [Music]}
var shuFen StudentMangement
shuFen.name = "淑芬"
resetName(shuFen)
fmt.Println(shuFen.name) // 淑芬
resetNamePoint(&shuFen)
fmt.Println(shuFen.name) // resetName
}
結構體佔用一塊連續的內存,巧妙的安排字節對齊可以節省內存
大神博客:
結構體字段的可見性
結構體中字段大寫開頭表示可公開訪問,小寫表示私有(僅在定義當前結構體的包中可訪問)。
匿名結構體
結構體允許其成員字段在聲明時沒有字段名而只有類型,這種沒有名字的字段就稱爲匿名字段。同一個結構體內 同一類型的匿名字段 唯一。
package main
import "fmt"
type Anonymous struct {
string
int
}
func main() {
a := Anonymous{
"name",
2020,
}
fmt.Printf("%#v\n", a)
}
結構體嵌套
結構體中包含結構體
// 嵌套結構體
package main
import "fmt"
type Anonymous struct {
string
int
}
type Nest struct {
name string
id int
anonymous Anonymous
// Anonymous // 嵌套匿名結構體
}
func main() {
a := Anonymous{
"name",
2020,
}
fmt.Printf("%#v\n", a)
n := Nest{
name: "Nest",
id: 2020,
anonymous: Anonymous{
"Anonymous",
20,
},
}
fmt.Printf("%#v\n", n)
}
// main.Anonymous{string:"name", int:2020}
// main.Nest{name:"Nest", id:2020, anonymous:main.Anonymous{string:"Anonymous", int:20}}