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?