Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Golang - Asterisk and Ampersand Cheatsheet
/*
********************************************************************************
Golang - Asterisk and Ampersand Cheatsheet
********************************************************************************
Also available at: https://play.golang.org/p/lNpnS9j1ma
Allowed:
--------
p := Person{"Steve", 28} stores the value
p := &Person{"Steve", 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{"Steve", 28} illegal
func PrintPerson(p &Person) illegal
*/
package main
import (
"fmt"
)
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() {
p := Person{"Steve", 28}
printPerson1(p)
updatePerson1(p)
printPerson1(p)
}
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() {
p := &Person{"Steve", 28}
printPerson2(p)
updatePerson2(p)
printPerson2(p)
}
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() {
p := Person{"Steve", 28}
printPerson3(&p)
updatePerson3(&p)
printPerson3(&p)
}
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{"Steve", 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: {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()
}
@RoughChopTom
Copy link

RoughChopTom commented Feb 20, 2019

Thanks!

@117
Copy link

117 commented Mar 19, 2019

thx

@okcthulhu
Copy link

okcthulhu commented Jul 7, 2019

Good stuff.

@tab0r
Copy link

tab0r commented Jul 16, 2019

Thank you!

@Ardiantirta
Copy link

Ardiantirta commented Nov 7, 2019

Awesome!

@carlos-menezes
Copy link

carlos-menezes commented Feb 23, 2020

Thank you!

@DanazSdiq
Copy link

DanazSdiq commented Mar 20, 2020

Thank you!

@erpel
Copy link

erpel commented Jul 29, 2020

Just to clarify, in line 43 "it takes up more space" means calling a method like this during runtime uses more memory?

@josephspurrier
Copy link
Author

josephspurrier commented Aug 5, 2020

@erpel nah, it just requires more characters to type.

@hopik007
Copy link

hopik007 commented Apr 8, 2021

awsome !!!

@ViktorReib
Copy link

ViktorReib commented Jun 5, 2021

easy to understand, thanks!

@stankud
Copy link

stankud commented Oct 9, 2021

This is probably the best explanation on this topic on the internet

@josephspurrier
Copy link
Author

josephspurrier commented Oct 12, 2021

This is probably the best explanation on this topic on the internet

@stankud Wonderful to hear, thanks!

@sohhamm
Copy link

sohhamm commented Feb 12, 2022

Thanks!

@viniciusao
Copy link

viniciusao commented Mar 3, 2022

I was in doubt about the asterisk at function's parameters. Simple and direct explanation, thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment