package main

import "fmt"

type person struct {
	name string
	age  int
}

func newPerson(name string) *person {
	p := person{name: name}
	p.age = 42
	return &p
}

func main() {
	fmt.Println(person{"Bob", 20})
	fmt.Println(person{"Alice", 30})
	// fmt.Println(person{"Fred"}) // will zero value age. Compiler don't like it actually.
	fmt.Println(&person{"Ann", 40})
	fmt.Println(newPerson("Jon"))

	s := person{name: "Sean", age: 50}

	fmt.Println(s.name)

	sp := &s
	fmt.Println(sp.age)

	sp.age = 51
	fmt.Println(sp.age)

	// If a single use struct you can omit the decalre the struct type and just use it directly on the initialization.
	dog := struct {
		name   string
		isGood bool
	}{
		"Mike",
		true,
	}
	fmt.Println(dog)
}
