

********************************************************************************
Golang - Asterisk and Ampersand Cheatsheet
********************************************************************************

Also available at: https://play.golang.org/p/lNpnS9j1ma

Allowed:
--------
```go
/*

********************************************************************************

Golang - Asterisk and Ampersand Cheatsheet

********************************************************************************

  

Allowed:

--------

p := Person{"Hillary", 28}  stores the value

p := &Person{"Hillary", 28}     stores the pointer address (reference)

PrintPerson(p)          passes either the value or pointer address (reference)

PrintPerson(*p)         passes the value

PrintPerson(&p)         passes the pointer address (reference)

func PrintPerson(p Person)  ONLY receives the value

func PrintPerson(p *Person) ONLY receives the pointer address (reference)

  

Not Allowed:

--------

p := *Person{"Hillary", 28}     illegal

func PrintPerson(p &Person) illegal

  

*/

  

package main

  

import (

    "fmt"

)

  

type Erdem struct {

    CodingSkillPercent int

    Occupation         string

}

type Person struct {

    Name string

    Age  int

}

  

// This only works with *Person, does not work with Person

// Only works with Test 2 and Test 3

func (p *Person) String() string {

    return fmt.Sprintf("%s is %d", p.Name, p.Age)

}

  

// This works with both *Person and Person, BUT you can't modiy the value and

// it takes up more space

// Works with Test 1, Test 2, Test 3, and Test 4

/*func (p Person) String() string {

    return fmt.Sprintf("%s is %d", p.Name, p.Age)

}*/

  

// *****************************************************************************

// Test 1 - Pass by Value

// *****************************************************************************

  

func test1() {

    fmt.Println("Test 1")

    p := Person{"Hillary", 28}

    printPerson1(p)

    updatePerson1(p)

    printPerson1(p)

    fmt.Println("Test 1 ENDS")

}

  

func updatePerson1(p Person) {

    p.Age = 32

    printPerson1(p)

}

  

func printPerson1(p Person) {

    fmt.Printf("String: %v | Name: %v | Age: %d\n",

        p,

        p.Name,

        p.Age)

}

  

// *****************************************************************************

// Test 2 - Pass by Reference

// *****************************************************************************

  

func test2() {

    fmt.Println("Test 2")

    p := &Person{"Hillary", 28}

    printPerson2(p)

    updatePerson2(p)

    printPerson2(p)

    fmt.Println("Test 2 ENDS")

}

  

func updatePerson2(p *Person) {

    p.Age = 32

    printPerson2(p)

}

  

func printPerson2(p *Person) {

    fmt.Printf("String: %v | Name: %v | Age: %d\n",

        p,

        p.Name,

        p.Age)

}

  

// *****************************************************************************

// Test 3 - Pass by Reference (requires more typing)

// *****************************************************************************

  

func test3() {

    fmt.Println("Test 3")

    p := Person{"Hillary", 28}

    printPerson3(&p)

    updatePerson3(&p)

    printPerson3(&p)

    fmt.Println("Test 3 ENDS")

}

  

func updatePerson3(p *Person) {

    p.Age = 32

    printPerson3(p)

}

  

func printPerson3(p *Person) {

    fmt.Printf("String: %v | Name: %v | Age: %d\n",

        p,

        p.Name,

        p.Age)

}

  

// *****************************************************************************

// Test 4 - Pass by Value (requires more typing)

// *****************************************************************************

  

func test4() {

    p := &Person{"Hillary", 28}

    printPerson4(*p)

    updatePerson4(*p)

    printPerson4(*p)

}

  

func updatePerson4(p Person) {

    p.Age = 32

    printPerson4(p)

}

  

func printPerson4(p Person) {

    fmt.Printf("String: %v | Name: %v | Age: %d\n",

        p,

        p.Name,

        p.Age)

}

  

// *****************************************************************************

// Main

// *****************************************************************************

  

/*

Outputs:

String: {Hillary 28} | Name: Hillary | Age: 28

String: {Hillary 32} | Name: Hillary | Age: 32

String: {Hillary 28} | Name: Hillary | Age: 28

String: Hillary is 28 | Name: Hillary | Age: 28

String: Hillary is 32 | Name: Hillary | Age: 32

String: Hillary is 32 | Name: Hillary | Age: 32

String: Hillary is 28 | Name: Hillary | Age: 28

String: Hillary is 32 | Name: Hillary | Age: 32

String: Hillary is 32 | Name: Hillary | Age: 32

String: {Hillary 28} | Name: Hillary | Age: 28

String: {Hillary 32} | Name: Hillary | Age: 32

String: {Hillary 28} | Name: Hillary | Age: 28

*/

func main() {

    test1()

    test2()

    test3()

    test4()

}

// *****************************************************************************
// Main
// *****************************************************************************

/*
Outputs:
String: {Steve 28} | Name: Steve | Age: 28
String: {Steve 32} | Name: Steve | Age: 32
String: {Steve 28} | Name: Steve | Age: 28
String: Steve is 28 | Name: Steve | Age: 28
String: Steve is 32 | Name: Steve | Age: 32
String: Steve is 32 | Name: Steve | Age: 32
String: Steve is 28 | Name: Steve | Age: 28
String: Steve is 32 | Name: Steve | Age: 32
String: Steve is 32 | Name: Steve | Age: 32
String: {Steve 28} | Name: Steve | Age: 28
String: {Steve 32} | Name: Steve | Age: 32
String: {Steve 28} | Name: Steve | Age: 28
*/
func main() {	
	test1()
	test2()
	test3()
	test4()
}
```
