Functions

Go์˜ functions๋ฅผ ์•Œ์•„๋ณด์•„์š”

Types in fuction

  • ํ•จ์ˆ˜์˜ argument์™€ return ๊ฐ’์˜ type์„ ๋ช…์‹œํ•ด์ค˜์•ผ ํ•œ๋‹ค

    • compiler์—๊ฒŒ type์ด ๋ฌด์—‡์ธ์ง€ ์•Œ๋ ค์คŒ์œผ๋กœ์จ ๋น ๋ฅด๊ฒŒ compile ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค!

      • Java๋ž‘ ์œ ์‚ฌ! Python์ด๋ž‘์€ ๋„ˆ๋ฌด ๋‹ค๋ฆ„...

    • ex)

      package main
      
      import "fmt"
      
      func multiply(a int, b int) int {
       return a * b
      }
      
      func main() {
       fmt.Println(multiply(2, 4))
      }
  • argument ๋“ค์˜ type์ด ๊ฐ™์œผ๋ฉด ํ•œ ๋ฒˆ๋งŒ ๋ช…์‹œํ•ด๋„ ๋œ๋‹ค

    • ex)

      func multiply(a, b int) int {
       return a * b
      }
  • return์ด ํ•„์š”ํ•œ ํ•จ์ˆ˜๋Š” ๊ผญ return type์„ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค!

Multiple Return Values

  • Go๋Š” multiple return value ๋ฅผ ์ง€์›ํ•œ๋‹ค

    • ๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋“ค๊ณผ ๋‹ค๋ฅธ Go์˜ ํŠน์ง•์ด๋‹ค!

    • ex)

      package main
      
      import (
       "fmt"
       "strings"
      )
      
      func lenAndUpper(name string) (int, string) {
       return len(name), strings.ToUpper(name)
      }
      
      func main() {
       totalLength, upperName := lenAndUpper("chloe")
       fmt.Println(totalLength, upperName)
      }
      
  • ๋‹จ, return ํ•˜๋Š” ๊ฐœ์ˆ˜๋ณด๋‹ค ์ ๊ฒŒ ๊ฐ’์„ ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค!

    • ex) Error๊ฐ€ ๋ฐœ์ƒํ•  ์˜ˆ์‹œ

       totalLength := lenAndUpper("chloe")
      • lenAndUpper๋Š” ๋‘ ๊ฐœ์˜ ๊ฐ’์„ return ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์€ error๋ฅผ ๋ฑ‰๋Š”๋‹ค

        go101/03_functions on ๎‚  master [!?] via ๐Ÿน v1.15.6 
        โžœ go run main.go
        # command-line-arguments
        ./main.go:18:14: assignment mismatch: 1 variable but lenAndUpper returns 2 values
  • ์ด๋Ÿด ๋•Œ์—๋Š” _ ๋ฅผ ๋„ฃ์–ด value ๊ฐ’์„ ๋ฌด์‹œํ•˜๋„๋ก ํ•˜๋ฉด ๋œ๋‹ค

    • ex)

       totalLength, _ := lenAndUpper("chloe")
      • ์ด๋ ‡๊ฒŒ underscore (_) ๋Š” ignored value๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค!

        • compiler๋Š” ignored value๋ฅผ ๋ง๊ทธ๋Œ€๋กœ ๋ฌด์‹œํ•œ๋‹ค

Variadic functions

  • ... ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€๋ณ€์ธ์ž ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค

    • ๋ฐฉ๋ฒ•์€ type์•ž์— ... ๋ฅผ ๋ถ™์ด๋ฉด ๋œ๋‹ค! ์ด๊ฒŒ ๋์ด๋‹ค!

    • ex)

      func repeatMe(words ...string) {
       fmt.Println(words)
      }

Naked returns

  • ํ•จ์ˆ˜์˜ return type์„ ๋ช…์‹œํ•  ๋•Œ returnํ•  ๊ฐ’์„ ๋ฏธ๋ฆฌ ์„ ์–ธํ•˜๊ณ , ๋น„์–ด์žˆ๋Š” return์„ ํ•˜๋Š” ๊ฒƒ

    • ์„ ์–ธ ํ•  ๋•Œ ์ดˆ๊ธฐํ™” ๋˜๋ฏ€๋กœ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋Š” ํ•ด๋‹น variable์„ update ํ•˜๋Š” ๊ฒƒ์ด๋‹ค!

      • returnํ•  value๋ฅผ ๋ช…์‹œํ•˜์ง€ ์•Š๊ณ  return ํ•  ์ˆ˜ ์žˆ๋‹ค

    • ex)

      package main
      
      import (
       "fmt"
       "strings"
      )
      
      func lenAndLower(name string) (length int, lowercase string) {
       length = len(name)
       lowercase = strings.ToLower(name)
       return
      }
      
      func main() {
       length, name := lenAndLower("CHLOE")
       fmt.Println(length, name)
      }
  • ํ™•์‹คํ•˜๊ฒŒ ์–ด๋–ค ๊ฐ’์ด return ๋˜๋Š”์ง€ ๋ช…์‹œํ•˜๊ณ  ์‹ถ์œผ๋ฉด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค

defer

  • function์ด ๋๋‚œ ํ›„ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ

    • ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ์„ ๋•Œ defer๋ฅผ ํ†ตํ•ด ์ถ”๊ฐ€์ ์œผ๋กœ ๋ฌด์–ธ๊ฐ€ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค

      • return ๊ฐ’์ด ์žˆ๋Š” ํ•จ์ˆ˜๋ผ๋ฉด return ๋œ ํ›„์— defer ๊ฐ€ ์‹คํ–‰๋œ๋‹ค

    • ex)

      func lenAndLower(name string) (length int, lowercase string) {
        // defer
       defer fmt.Println("Done!")
        
       length = len(name)
       lowercase = strings.ToLower(name)
       return
      }
  • defer๋ฅผ ํ•จ์ˆ˜ ์ข…๋ฃŒ ํ›„ image๋‚˜ file์„ ๋‹ซ๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๊ณ , API request ๋ณด๋‚ด๋Š” ๊ฒƒ์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค!

Last updated

Was this helpful?