golang 노트--함수와 방법
package math func Sin(x float64) float //implemented in assembly language  
                  ,           ,      return        ,        bare return。
go      ,                ,              ,           ,         ,         。
     ,            ,         ,         ,      。        ,      lambda   。strings.Map         。
  func squares() func() int {
    var x int
    return func() int {
        x++
        return x * x
    }
}
func main() {
    f := squares()
    fmt.Println(f()) // "1"
    fmt.Println(f()) // "4"
    fmt.Println(f()) // "9"
    fmt.Println(f()) // "16"
}   
  
 匿名函数和squares中,存在变量引用。这就是函数值属于引用类型和函数值不可比较的原因。Go使用闭包(closures)技术实现函数值,Go程序员也把函数值叫做闭包。
 
  注意golang圣经中匿名函数一节中的例子程序。
 
  
 
 go语言的可变参函数非常好用,你可以传递多个同类型参数,也可以直接传入一个该类型的切片(注意传入切片时要使用...标记,我想应该是为了同切片参数区分吧,毕竟两者还是有些不同的),如果想要使用不同类型的变参,那么使用万能的 interfac{} ,函数体内像解析切片一样解析这个变参就好了。
 
  
 
 直到包含该defer语句的函数执行完毕时,defer后的函数才会被执行,不论包含defer语句的函数是通过return正常结束,还是由于panic导致的异常结束。你可以在一个函数中执行多条defer语句,它们的执行顺序与声明顺序相反
 
  
 
 var mu sync.Mutex var m = make(map[string]int) func lookup(key string) int { mu.Lock() defer mu.Unlock() return m[key] }
       ,defer                  。
  func bigSlowOperation() { defer trace("bigSlowOperation")() // don't forget the extra parentheses // ...lots of work… time.Sleep(10 * time.Second) // simulate slow operation by sleeping } func trace(msg string) func() { start := time.Now() log.Printf("enter %s", msg) return func() { log.Printf("exit %s (%s)", msg,time.Since(start)) } }
  
더블의 반환 값을 먼저 명명하고 defer 문장을 추가하면 더블이 호출될 때마다 매개 변수와 반환 값을 출력할 수 있습니다.func double(x int) (result int) { defer func() { fmt.Printf("double(%d) = %d
", x,result) }() return x + x } _ = double(4) // Output: // "double(4) = 8" 
     
  
디버깅에 너무 유리해...defer 문장은 그래도 자세히 보아야 한다.
  
  
문제를 진단하기 편리하도록 런타임 패키지는 프로그래머가 창고 정보를 출력할 수 있도록 합니다.다음 예에서main 함수에서 printStack 출력 창고 정보를 지연해서 호출합니다.gopl.io/ch5/defer2 func main() { defer printStack() f(3) } func printStack() { var buf [4096]byte n := runtime.Stack(buf[:], false) os.Stdout.Write(buf[:n]) }
                    ,    。
   
    :go           ,   go         。
  package main
import (
    "fmt"
)
func add(a int, b int) int {
    return a + b 
}
func sub(a int, b int) int {
    return a - b 
}
func main() {
    fm := make(map[int]func(int, int) int)
    fm[1001] = add 
    fm[1002] = sub 
    protocol := 2001
    i := 1
    j := 2
    if func_handle, ok := fm[protocol]; ok {
        println(func_handle(i, j)) 
    } else {
        fmt.Printf("protocol: %d not register!", protocol)
    }   
}
   
  
 
 
                이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.