struct
是定義資料的集合,跟物件很像,也是把資料集合在一包。
定義
struct
可以使用 type
關鍵字定義,開頭的大小寫跟函式一樣,會影響能見度;內部的成員名的定義也是一樣。
定義與使用的範例如下:
package main
import "fmt"
type People struct { name string age int }
func main() { miles := People{`Miles`, 18} fmt.Println(miles) fmt.Println(miles.name) fmt.Println(miles.age) chou := People{age: 18, name: `Chou`} fmt.Println(chou)
part := People{name: `Part`} fmt.Println(part)
empty := People{} fmt.Println(empty)
var empty2 People fmt.Println(empty2) }
|
上面可以注意
chou
範例可以在指定值的時候改順序
part
範例在指定部分值的時候,必須確定指明是哪個部分,比方說上例的 name
,即使順序一樣,沒有指明 name
的話一樣會出錯,比方說:part := People{"Part"}
這是不合法的範例
empty
、empty2
是零值範例
如果把一個結構指定給另一個結構時,它會使用複製:
package main
import "fmt"
type People struct { name string age int }
func main() { miles := People{`Miles`, 18} copy := miles copy.name = `Copy` fmt.Println(miles) fmt.Println(copy) }
|
函數傳遞也是如此,如果需要傳址,可以直接用指標
package main
import "fmt"
type People struct { name string age int }
func changeName(people *People) { people.name = `Someone` }
func main() { miles := People{`Miles`, 18} fmt.Println(miles)
changeName(&miles) fmt.Println(miles) }
|
使用 new
關鍵字的話,得到的會是指標:
package main
import "fmt"
type People struct { name string age int }
func changeName(people *People) { people.name = `Someone` }
func main() { miles := new(People) miles.name = `Miles` miles.age = 18 fmt.Println(miles)
changeName(miles) fmt.Println(miles) }
|
結構的成員也可以結構,雖然無法直接把自己包起來,但可以使用指標,如:
package main
import "fmt"
type People struct { name string age int friend *People }
func main() { friend := new(People) friend.name = `Friend`
miles := People{`Miles`, 18, friend} fmt.Println(miles) fmt.Println(miles.name) fmt.Println(miles.friend.name) }
|
參考資料