Basics

Golang structs are what you expect

package main
 
import "fmt"
 
type Vertex struct {
	X int
	Y int
}
 
func main() {
	fmt.Println(Vertex{1, 2})
}

Struct fields

Struct fields are accessed using a dot

package main
 
import "fmt"
 
type Coorindate struct {
	X int
	Y int
}
 
func main() {
	coordinate := Coorindate{1, 67}
	coordinate.X = 26
	fmt.Println(coordinate.X)
}

Struct literals

You can also newly allocate a struct by listing the values of its fields. This is known as a “struct literal” (duh)

package main
 
import "fmt"
 
type Vertex struct {
	X, Y int
}
 
var (
	v1 = Vertex{1, 2}  // has type Vertex
	v2 = Vertex{X: 1}  // Y:0 is implicit
	v3 = Vertex{}      // X:0 and Y:0
	p  = &Vertex{1, 2} // has type *Vertex
)
 
func main() {
	fmt.Println(v1, p, v2, v3)
}

Struct tags

Struct tags allow other modules accessing struct members to format member values.

Control encoding

package main
 
import (
	"encoding/json"
	"fmt"
	"log"
	"os"
	"time"
)
 
type User struct {
	Name          string    `json:"name"`
	Password      string    `json:"password"`
	PreferredFish []string  `json:"preferredFish"`
	CreatedAt     time.Time `json:"createdAt"`
}
 
func main() {
	u := &User{
		Name:      "Sammy the Shark",
		Password:  "fisharegreat",
		CreatedAt: time.Now(),
	}
 
	out, err := json.MarshalIndent(u, "", "  ")
	if err != nil {
		log.Println(err)
		os.Exit(1)
	}
 
	fmt.Println(string(out))
}

Remove empty fields

package main
 
import (
	"encoding/json"
	"fmt"
	"log"
	"os"
	"time"
)
 
type User struct {
	Name          string    `json:"name"`
	Password      string    `json:"password"`
	PreferredFish []string  `json:"preferredFish,omitempty"`
	CreatedAt     time.Time `json:"createdAt"`
}
 
func main() {
	u := &User{
		Name:      "Sammy the Shark",
		Password:  "fisharegreat",
		CreatedAt: time.Now(),
	}
 
	out, err := json.MarshalIndent(u, "", "  ")
	if err != nil {
		log.Println(err)
		os.Exit(1)
	}
 
	fmt.Println(string(out))
}

Ignore private fields

package main
 
import (
	"encoding/json"
	"fmt"
	"log"
	"os"
	"time"
)
 
type User struct {
	Name      string    `json:"name"`
	Password  string    `json:"-"`
	CreatedAt time.Time `json:"createdAt"`
}
 
func main() {
	u := &User{
		Name:      "Sammy the Shark",
		Password:  "fisharegreat",
		CreatedAt: time.Now(),
	}
 
	out, err := json.MarshalIndent(u, "", "  ")
	if err != nil {
		log.Println(err)
		os.Exit(1)
	}
 
	fmt.Println(string(out))
}