Go’s structs are typed collections of fields. They’re useful for grouping data together to form records. |
|
![]() ![]() package main |
|
import "fmt" |
|
This |
type person struct { name string age int } |
|
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}) |
You can name the fields when initializing a struct. |
fmt.Println(person{name: "Alice", age: 30}) |
Omitted fields will be zero-valued. |
fmt.Println(person{name: "Fred"}) |
An |
fmt.Println(&person{name: "Ann", age: 40}) |
It’s idiomatic to encapsulate new struct creation in constructor functions |
fmt.Println(newPerson("Jon")) |
Access struct fields with a dot. |
s := person{name: "Sean", age: 50} fmt.Println(s.name) |
You can also use dots with struct pointers - the pointers are automatically dereferenced. |
sp := &s fmt.Println(sp.age) |
Structs are mutable. |
sp.age = 51 fmt.Println(sp.age) |
If a struct type is only used for a single value, we don’t have to give it a name. The value can have an anonymous struct type. This technique is commonly used for table-driven tests. |
dog := struct { name string isGood bool }{ "Rex", true, } fmt.Println(dog) } |
$ go run structs.go {Bob 20} {Alice 30} {Fred 0} &{Ann 40} &{Jon 42} Sean 50 51 {Rex true} |
Next example: Methods.