Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Go Functions

Go Functions

Functions in Go, including first-class functions and closures.

Nathan Youngman

June 13, 2015
Tweet

More Decks by Nathan Youngman

Other Decks in Programming

Transcript

  1. Today ✴ Functions ✴ Parameters & arguments ✴ Variable scope

    ✴ Pass by value ✴ Return results ✴ Named results ✴ First-class functions ✴ Closures
  2. Last time var path string name type keyword package main


    
 import "fmt"
 
 func main() {
 var name string
 name = "Kim"
 fmt.Println("Hello", name)
 }
  3. Function declaration func playSong(path string) {
 // engage in funky

    music
 } keyword function name name type first parameter
  4. Variable scope package main
 
 import (
 "fmt"
 "path/filepath"
 )


    
 func playSong(path string) {
 var song = filepath.Base(path)
 fmt.Println("Playing song:", song)
 }
 
 func main() {
 var song = "/Music/Andy Hunter/Exodus/Go.mp3"
 playSong(song)
 } play.golang.org/p/CcjBwYznZo
  5. Pass by value package main
 
 import (
 "fmt"
 "path/filepath"


    )
 
 func playSong(path string) {
 path = filepath.Clean(path)
 fmt.Println("Playing music:", path)
 }
 
 func main() {
 var path = "/../Music//Andy Hunter/Exodus/Go.mp3"
 playSong(path)
 fmt.Println("Path in main:", path)
 } play.golang.org/p/cYKdCm10Sv
  6. Results func readID3(path string) (title string, year int) {
 //

    return metadata
 } keyword function name name type parameter name type first result name type second result
  7. Results in practice package main
 
 func readID3(path string) (title

    string, year int) {
 return "One Motion", 2012
 }
 
 func main() {
 var title, year = readID3(“One Motion.mp3")
 }
  8. Results of the same type func readID3(path string) (title, artist,

    album string, year int, track uint8) {
 return "One Motion", "Andy Hunter", "Glow", 2012, 3
 }
  9. Bare return package main
 
 func readID3(path string) (title, artist,

    album string, year int, track uint8) {
 title = "One Motion"
 artist = "Andy Hunter"
 album = "Glow"
 year = 2012
 track = 3
 return
 }

  10. Result name and type package main
 
 import "fmt"
 


    func playSong(path string) (err error) {
 err = fmt.Errorf("Unable to read: %s", path)
 return err
 }
  11. Just the result type package main
 
 import "fmt"
 


    func playSong(path string) error {
 var err = fmt.Errorf("Unable to read: %s", path)
 return err
 }
  12. Announcer package main
 
 import "fmt"
 
 func announce(title, artist

    string) {
 fmt.Print("And now for the smooth sound of ")
 fmt.Print(artist, " with ", title, ".")
 }
 
 func main() {
 announce("One Motion", "Andy Hunter")
 }

  13. Say (OS X) package main
 
 import "os/exec"
 
 func

    say(text string) {
 var cmd = exec.Command("say", "-v", "Cellos", text)
 cmd.Run()
 }
 
 func main() {
 say("I like pizza")
 }
  14. First-class functions package main
 
 import (
 "fmt"
 "os/exec"
 )


    
 func display(text string) {
 fmt.Println(text)
 }
 
 func say(text string) {
 var cmd = exec.Command("say", "-v", "Cellos", text)
 cmd.Run()
 }
 
 func main() {
 var f func(text string)
 f = display
 f("Hello World")
 f = say
 f("Hello World")
 }
 play.golang.org/p/QW2AERS_Ap
  15. Higher-order functions a function parameter //... func announce(title, artist string,

    speak func(text string)) {
 speak("And now for the smooth sound of " + artist + " with " + title + ".")
 }
 
 func display(text string) {
 fmt.Println(text)
 }
 
 func say(text string) {
 var cmd = exec.Command("say", "-v", "Cellos", text)
 cmd.Run()
 }
 
 func main() {
 announce("One Motion", "Andy Hunter", say)
 announce("One Motion", "Andy Hunter", display)
 } play.golang.org/p/T8yTum1wcR
  16. Higher-order functions and closures a function result package main
 


    import "os/exec"
 
 func sayGen(voice string) func(text string) {
 return func(text string) {
 var cmd = exec.Command("say", "-v", voice, text)
 cmd.Run()
 }
 }
 
 func main() {
 var say = sayGen("Cellos")
 say("Hello World")
 
 var organ = sayGen("Pipe Organ")
 organ("This sounds like a pipe organ")
 } play.golang.org/p/Wf9f4Kh12O