Go's _structs_ are typed collections of fields. They're useful for grouping data together to form records. | ||
package main |
||
import "fmt" |
||
This `person` struct type has `name` and `age` fields. | type person struct { |
|
name string |
||
age int |
||
} |
||
`newPerson` constructs a new person struct with the given name. | func newPerson(name string) *person { |
|
You can safely return a pointer to local variable as a local variable will survive the scope of the function. | p := person{name: name} |
|
p.age = 42 |
||
return &p |
||
} |
||
func main() { |
||
This syntax creates a new struct. | fmt.Println(person{"Bob", 20}) |
{Bob 20} |
You can name the fields when initializing a struct. | fmt.Println(person{name: "Alice", age: 30}) |
{Alice 30} |
Omitted fields will be zero-valued. | fmt.Println(person{name: "Fred"}) |
{Fred 0} |
An `&` prefix yields a pointer to the struct. | fmt.Println(&person{name: "Ann", age: 40}) |
&{Ann 40} |
It's idiomatic to encapsulate new struct creation in constructor functions | fmt.Println(newPerson("Jon")) |
&{Jon 42} |
Access struct fields with a dot. | s := person{name: "Sean", age: 50} |
|
fmt.Println(s.name) |
Sean |
|
You can also use dots with struct pointers - the pointers are automatically dereferenced. | sp := &s |
|
fmt.Println(sp.age) |
50 |
|
Structs are mutable. | sp.age = 51 |
|
fmt.Println(sp.age) |
51 |
|
} |