真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

golang中函數(shù)和方法的介紹

如果你遇到?jīng)]有函數(shù)體的函數(shù)聲明,表示該函數(shù)不是以Go實現(xiàn)的。

成都創(chuàng)新互聯(lián)是一家專注于成都做網(wǎng)站、成都網(wǎng)站設(shè)計、成都外貿(mào)網(wǎng)站建設(shè)與策劃設(shè)計,仁和網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:仁和等地區(qū)。仁和做網(wǎng)站價格咨詢:18980820575

package math
func Sin(x float64) float //implemented in assembly language

如果為函數(shù)的每一個返回值都設(shè)置變量名,則會以相應(yīng)的零值初始化,且在該函數(shù)的return語句中省略操作數(shù),這種用法稱之為 bare return。

go中的錯誤處理,習(xí)慣上是先進行一系列的初始化檢查,將處理失敗邏輯的代碼先行處理,然后才是函數(shù)的實際邏輯,這樣使得代碼更簡潔,避免過多的層級結(jié)構(gòu)。

函數(shù)定義時,可以使用函數(shù)類型作為參數(shù),也可以作為返回類型,是不是有點類似委托,從而實現(xiàn)閉包。此外還有匿名函數(shù),是不是類似于lambda表達式。strings.Map 函數(shù)可以拿來試驗。

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"
}

匿名函數(shù)和squares中,存在變量引用。這就是函數(shù)值屬于引用類型和函數(shù)值不可比較的原因。Go使用閉包(closures)技術(shù)實現(xiàn)函數(shù)值,Go程序員也把函數(shù)值叫做閉包。

注意golang圣經(jīng)中匿名函數(shù)一節(jié)中的例子程序。

go語言的可變參函數(shù)非常好用,你可以傳遞多個同類型參數(shù),也可以直接傳入一個該類型的切片(注意傳入切片時要使用...標(biāo)記,我想應(yīng)該是為了同切片參數(shù)區(qū)分吧,畢竟兩者還是有些不同的),如果想要使用不同類型的變參,那么使用萬能的 interfac{} ,函數(shù)體內(nèi)像解析切片一樣解析這個變參就好了。

直到包含該defer語句的函數(shù)執(zhí)行完畢時,defer后的函數(shù)才會被執(zhí)行,不論包含defer語句的函數(shù)是通過return正常結(jié)束,還是由于panic導(dǎo)致的異常結(jié)束。你可以在一個函數(shù)中執(zhí)行多條defer語句,它們的執(zhí)行順序與聲明順序相反

var mu sync.Mutex
var m = make(map[string]int)
func lookup(key string) int {
    mu.Lock()
    defer mu.Unlock()
    return m[key]
}

調(diào)試復(fù)雜程序時,defer機制也常被用于記錄何時進入和退出函數(shù)。

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)) 
    }
}

我們只需要首先命名double的返回值,再增加defer語句,我們就可以在double每次被調(diào)用時,輸出參數(shù)以及返回值。

func double(x int) (result int) {
    defer func() { fmt.Printf("double(%d) = %d\n", x,result) }()
    return x + x
}
_ = double(4)
// Output:
// "double(4) = 8"

為了方便診斷問題,runtime包允許程序員輸出堆棧信息。在下面的例子中,我們通過在main函數(shù)中延遲調(diào)用printStack輸出堆棧信息。

gopl.io/ch6/defer2
func main() {
    defer printStack()
    f(3)
}
func printStack() {
    var buf [4096]byte
    n := runtime.Stack(buf[:], false)
    os.Stdout.Write(buf[:n])
}

不能為一個結(jié)構(gòu)體定義同名的字段名和方法名,有點奇怪。

函數(shù)指針:go里其實也是有函數(shù)指針的,下面用go語言實現(xiàn)表驅(qū)動模式。

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)
    }   
}

返回局部變量指針:

不同于 C 語言,GO 的函數(shù)可以返回局部變化指針,且編譯器會通過逃逸分析(escape analysis)來決定是否在堆上分配內(nèi)存。

編譯時可以通過 -gcflags "-l -m" 參數(shù)來禁用函數(shù)內(nèi)聯(lián),函數(shù)內(nèi)聯(lián)會對內(nèi)存分配有一些影響,具體不清楚。

函數(shù)參數(shù)沒有所謂的引用傳遞,都是值傳遞的,區(qū)別只是傳遞的是拷貝對象還是指針而已。在 C 語言中,一般推薦傳遞指針參數(shù)來避免復(fù)制對象提升效率。

但在 go 中,被復(fù)制的指針會延長目標(biāo)對象的生命周期,還可能導(dǎo)致它被分配到堆上,則性能消耗要加上堆內(nèi)存分配和垃圾回收的成本,而在棧上復(fù)制小對象其實非常快,所以如果不是特別大的對象或確實需要修改原對象,一般不需要傳指針參數(shù)。在并發(fā)編程中,也提倡使用不可變對象(只讀或復(fù)制),可以消除數(shù)據(jù)同步的麻煩。

如下就會在堆上分配內(nèi)存,編譯時通過 -gcflags "-m" 可查看匯編代碼:

func test(p *int) {
    go func() {
        println(p)
    }() 
}

func main() {
    x := 100 
    p := &x
    test(p)
}

使用傳出參數(shù),推薦使用返回值,也可以使用二級指針:

func test(p **int) {
    x := 100
    *p = &x
}

func main() {
    var p *int
    test(&p)
    println(*p)
}

以上就是go語言中函數(shù)與方法介紹的詳細內(nèi)容,更多請關(guān)注創(chuàng)新互聯(lián)其它相關(guān)文章!


當(dāng)前題目:golang中函數(shù)和方法的介紹
文章路徑:http://weahome.cn/article/ieojdj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部