Golang - Asterisk and Ampersand Cheatsheet Also available at: https://play.golang.org/p/lNpnS9j1ma Allowed: /* ******************************************************************************** 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() }