golangベース-関数は変数、カスタムtype、名前付き戻り値、可変パラメータ、defer、匿名です.

8395 ワード

  • 関数は変数タイプ
  • です.
  • typeタイプ関数model
  • をカスタマイズ
  • 名前付き戻り値、無視した戻り値
  • 可変パラメータ
  • defer用途
  • 匿名関数



  • 関数は変数タイプです
    package main
    
    import("fmt"
    
    )
    
    func main() {
            c := add
            fmt.Println(c)
    
            sum := c(10, 20)
            fmt.Println(sum)
    }
    
    
    func add(a, b int) int {
        return a + b
    }
    

    出力は次のとおりです.
    0x488a00
    30

    typeタイプ関数modelをカスタマイズ
    package main
    
    import("fmt"
    
    )
    //    type  ,func(int,int) int          
    type methodModel func(int,int) int 
    
    func add(a int ,b int) int {
        return a+b
    }
    //      methodModel       
    func operator(entity methodModel,a int,b int)int{
        return entity(a,b)
    }
    
    func main() {
            var a int = 1
            var b int = 2
            c:= add
            sum := operator(c,a,b)
            fmt.Printf("%d
    "
    ,sum) }

    出力3
    戻り値の名前付け、戻り値の無視
    1、値伝達2、参照伝達注意1:値伝達であれ、参照伝達であれ、関数に伝達されるのは変数のコピーであるが、値伝達は値のコピーである.リファレンス転送は、アドレスのコピーmap、slice、chan、ポインタ、interfaceがデフォルトでリファレンスで転送されます.
    package main
    
    import("fmt"
    
    )
    
    func add(a, b int) (c int) {
        c = a + b
        return
    }
    
    
    func calc(a, b int) (sum int, avg int) {
        sum = a + b
        avg = (a +b)/2
        return
    }
    
    
    func main() {
            var a int = 1
            var b int = 2
    
            c := add(a,b)
            fmt.Println(c)
    
            sum,_ := calc(a,b)
            fmt.Println(sum)
    
            sum1,avg1 := calc(a,b)
            ``
    mt.Println(sum1,avg1)
    }
    

    出力は次のとおりです.
    3
    3
    3 1

    可変パラメータ
    package main
    
    import("fmt"
    
    )
    
    func add(a int,args ... int)(result int) {
        result = a
        for i:=0;i<len(args);i++{
            result += args[i]
        }
        return
    }
    
    func main() {
        sum := add(1,2,3)
        fmt.Print(sum)
    
    }
    
    

    出力:6
    defer用途
  • 関数が戻るとdefer文が実行されます.したがって、リソースクリーンアップ
  • に使用することができる.
  • 複数のdefer文は、先進的な後出の方法で
  • を実行する.
  • defer文の変数は、defer宣言時に
  • が決定する.
    package main
    
    import("fmt"
    
    )
    
    func add(a int,b int) int{
        defer fmt.Println("defer method")
        return a + b
    }
    
    func main() {
        defer fmt.Println("defer main1")
        defer fmt.Println("defer main2")
        sum := add(1,2)
        fmt.Print(sum,"
    "
    ) defer fmt.Println("defer method after") }

    出力は次のとおりです.
    defer method
    3
    defer method after
    defer main2
    defer main1

    匿名関数
    package main
    
    import("fmt"
    
    )
    
    //    1
    var (
        result = func(a int,b int) int{
            return a + b
        }
    )
    
    //     
    func sum1(a int,b int)int {
        return a + b
    }
    
    //    2
    func sum2(a int ,b int) int {
        tempMethod := func(a int ,b int) int {
            return a + b
        } 
            return tempMethod(a,b)
    }
    
    
    
    func sum3(a int ,b int ) int {
        resultTemp := func(a int ,b int )int {
            return a + b
        }(a,b)
        return resultTemp
    }
    
    func main() {
    
        sum := result(1,2)
        fmt.Println(sum)
    
        method:=sum1
        fmt.Println(method(3,4))
    
        fmt.Println(sum2(4,6))
    
        fmt.Println(sum3(7,9))
    }
    

    出力は次のとおりです.
    3
    7
    10
    16