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