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