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()
}