Go語言學(xué)習(xí)之——函數(shù)

1、基礎(chǔ)類型

package main
?
import "fmt"
?
//名在前,類型在后,同類型可以:a,b int
func eval( a,b int, op string ) int{
    switch op{
    case "+":
        return a+b
    case "-":
        return a-b
    case "*":
        return a*b
    case "/":
        return a/b
    default:
        panic("unsupported operation: " + op)
    }
}
?
func main() {
    fmt.Println( eval(3,5,"*") )
}

2、可以返回多個(gè)值

package main
?
import "fmt"
?
//帶余除法:13 / 4 = 3...1
func div( a,b int ) ( int, int ){
    return a/b, a%b
}
?
func main() {
    fmt.Println( div(13,4) )
}
一般多返回值用來返回錯(cuò)誤
package main
?
import "fmt"
?
//返回了結(jié)果和error
func eval( a,b int, op string ) (int, error){
    switch op{
    case "+":
        return a+b, nil
    case "-":
        return a-b, nil
    case "*":
        return a*b, nil
    case "/":
        q, _ := div(a,b)
        return q, nil
    default:
        return 0, fmt.Errorf("unsupported operation: " + op)
    }
}
?
func div( a,b int ) ( q,r int ){
    return a/b, a%b
}
?
func main() {
    fmt.Println( eval(13,2, "=") ) // output: 0 unsupported operation: =
    if result, err := eval(13,4,"x" ); err != nil{
        fmt.Println("Error:", err )
    }else{
        fmt.Println(result)
    } // output: Error: unsupported operation: x
    fmt.Println( eval(13,2, "/") ) // output: 6 <nil>
}

3、可以給返回值取名字,一般用于簡單的函數(shù)

package main
?
import "fmt"
?
//可以給返回值取名字
func div( a,b int ) ( q,r int ){
    return a/b, a%b
}
?
func main() {
    q, r := div(13,4) //因?yàn)楹瘮?shù)返回值有名字,那么編譯器自動(dòng)生成名字時(shí)就會(huì)生成和函數(shù)返回值一樣的名字,雖然不知道快捷鍵是啥。。。
    fmt.Println(q, r)
}

4、多個(gè)返回值時(shí),如果只想接收一個(gè)返回值,另外一個(gè)返回值不用,可以使用_

package main
?
import "fmt"
?
//名在前,類型在后,同類型可以:a,b int
func eval( a,b int, op string ) int{
    switch op{
    case "+":
        return a+b
    case "-":
        return a-b
    case "*":
        return a*b
    case "/":
        q, _ := div(a,b) //這里不可以寫q, r := div(a,b),因?yàn)槎xr卻不使用是不允許的
        return q
    default:
        panic("unsupported operation: " + op)
    }
}
?
//帶余除法:13 / 4 = 3...1
//可以給返回值取名字
func div( a,b int ) ( q,r int ){
    return a/b, a%b
}
?
func main() {
    fmt.Println( eval(13,2, "/") )
}

5、go語言函數(shù)式編程,函數(shù)可以作為參數(shù)

ackage main
?
import (
    "fmt"
    "reflect"
    "runtime"
    "math"
)
?
func apply( op func( int, int) int, a,b int) int {
    p := reflect.ValueOf(op).Pointer()
    opName := runtime.FuncForPC(p).Name() //獲得函數(shù)名
    fmt.Printf("Calling function %s with args " + "(%d,%d)\n", opName, a, b ) //打印函數(shù)名和參數(shù)
    return op( a, b )
}
?
func pow( a,b int) int {
    return int(math.Pow( float64(a), float64(b) ))
}
?
func main() {
    fmt.Println( apply(pow, 3,4) ) // output: Calling function main.pow with args (3,4)   81
}

6、匿名函數(shù)

package main
?
import (
    "fmt"
    "reflect"
    "runtime"
    "math"
)
?
func apply( op func( int, int) int, a,b int) int {
    p := reflect.ValueOf(op).Pointer()
    opName := runtime.FuncForPC(p).Name() //獲得函數(shù)名
    fmt.Printf("Calling function %s with args " + "(%d,%d)\n", opName, a, b ) //打印函數(shù)名和參數(shù)
    return op( a, b )
}
?
func main() {
    // apply第一個(gè)參數(shù)可以使用匿名函數(shù)
    fmt.Println( apply( func(a,b int) int{
        return int( math.Pow( float64(a), float64(b) ) )
    }, 3,4) ) // output: Calling function main.main.func1 with args (3,4)  81
}

7、可變參數(shù)列表

package main

import "fmt"

func sum( numbers ...int ) int {
    s := 0
    for i := range numbers {
        s += numbers[i]
    }
    return s
}

func main() {
    fmt.Println( sum( 1,2,3,4,5 ) )
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容