package main import ( "fmt" ) type Vertex struct { X int Y int } func main() { fmt.Println("A struct is a collection of fields") fmt.Println(Vertex{1, 2}) fmt.Println("struct fields are accessed by using a dot") v := Vertex{6, 8} fmt.Printf("%T, %v\n", v, v) fmt.Printf("%T, %v\n", v.X, v.X) fmt.Printf("%T, %v\n", v.Y, v.Y) fmt.Printf("\n\n") fmt.Println("Struct fields can be accessed through a struct pointer") v2 := Vertex{6, 8} p := &v2 // var p *Vertex = &v2 // ALSO VALID (*p).X = 10 fmt.Printf("%T, %v, %p\n", p, p, p) fmt.Printf("%T, %v\n", *p, *p) fmt.Println("Go also allows to use struct pointers without * symbol while accesing elements:") p.X = 15 // VALID fmt.Println(*p) fmt.Printf("\n\n") fmt.Println("You can also use struct literals for assigning struct elements") var ( v3 = Vertex{10, 20} v4 = Vertex{X: 1} // Y:0 v5 = Vertex{} // X:0, Y:0 v6 = Vertex{Y: 15, X: 75} p2 = &Vertex{1, 2} ) fmt.Printf("%T, %v\n", v3, v3) fmt.Printf("%T, %v\n", v4, v4) fmt.Printf("%T, %v\n", v5, v5) fmt.Printf("%T, %v\n", v6, v6) fmt.Printf("%T, %v\n", p2, p2) fmt.Printf("%T, %v\n", *p2, *p2) }