你可能不知道的一些GoPackages知識(shí)-創(chuàng)新互聯(lián)

關(guān)于Go Package

Go Packages 主要用來(lái)把相關(guān)的functions, variables, 和constants 組織到一起,這樣你就可以很方便的遷移Packages和把它們用到自己的程序中。

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

注意除了main package, Go packages 不是自治程序,不能被編譯成可執(zhí)行文件。它們必須直接或者間接的被main package調(diào)用才能使用。
如果你直接執(zhí)行一個(gè)沒(méi)個(gè)package:

$ go run aPackage.go
go run: cannot run non-main package

關(guān)于Go function

匿名函數(shù)(anonymous functions)
匿名函數(shù)可以在內(nèi)部定義,而不需要使用函數(shù)名,匿名函數(shù)通常被用來(lái)實(shí)現(xiàn)一些不需要太多代碼的功能。在Go中 一個(gè)函數(shù)可以返回一個(gè)匿名函數(shù),或者使用匿名函數(shù)作為它的其中一個(gè)參數(shù)。另外,匿名函數(shù)可以通過(guò)變量來(lái)訪問(wèn)。注意,在函數(shù)式編程術(shù)語(yǔ)中,匿名函數(shù)也稱為閉包。
匿名函數(shù)具有較小的實(shí)現(xiàn)和功能集中點(diǎn),這被認(rèn)為是一種很好的做法。但是如果匿名函數(shù)沒(méi)有功能集中點(diǎn),那么你可能需要考慮使用常規(guī)函數(shù)。
注意不要在沒(méi)有特殊需求的時(shí)候使用大量的匿名函數(shù)。

Go 函數(shù)可以返回多個(gè)值

func aFunction() (int, int, float64, float64) {
}

下面會(huì)有一個(gè)用一個(gè)functions.go來(lái)展示Go的匿名函數(shù)

package main

import (

    "fmt"
    "os"
    "strconv"
)

func doubleSquare(x int) (int, int) { //函數(shù)返回兩個(gè)int 類型的值
    return x * x, x * x 
}

func main() {
    arguments := os.Args
    if len(arguments) != 2 {
        fmt.Println("The program needs 1 argument!")
        return
    }

    y, err := strconv.Atoi(arguments[1])
    if err != nil {
        fmt.Println(err)
        return
    }

    square := func (s int) int { //square的值為一個(gè)匿名函數(shù)
        return s * s 
    }
    fmt.Println("The  square of", y, "is", square(y))

    double := func (s int) int { //double的值為一個(gè)匿名函數(shù)
        return s + s
    }

   fmt.Println("The double of", y, "is", double(y))
    fmt.Println(doubleSquare(y))
    d, s := doubleSquare(y)
    fmt.Println(d, s)
}

上面的square 和 double 都持有一個(gè)匿名函數(shù)。不好的一點(diǎn)是,在以后的程序中你可以更改square,double或之后其他變量值為匿名函數(shù)的變量,這意味著這些變量的含義可以更改或計(jì)算成其他內(nèi)容。

修改值為匿名函數(shù)變量的值是不推薦的,因?yàn)檫@可能是導(dǎo)致非常難以排查bug的主要原因。

如上面所示我們可以直接打印doubleSquare()的返回值,也可以給他們分配不同的變量進(jìn)行打印。

執(zhí)行functions.go:

$ go run function.go 1 21 
The program needs 1 argument!
rMacBook:code mtsouk
$ go run functions.go 10
The square of 10 is 100
The double of 10 is 20
20 100
20 100

函數(shù)的返回值可以被命名

下面以returnNames.go為例,我們會(huì)把returnNames.go的代碼分成3部分來(lái)進(jìn)行講解
Part 1

package main

import (

    "fmt"
    "os"
    "strconv"
)

func nameMinMax(x, y int) (min, max int) {
    if x > y {
        min = y
        max = x
    } else {
        min = x
        max = y
    }
    return
}

在上面這段代碼中函數(shù)namedMinMax并沒(méi)有再return中指明返回值,但是由于我們?cè)诤瘮?shù)中定義了和函數(shù)返回值同名的變量,所以該函數(shù)會(huì)按照名稱對(duì)應(yīng)關(guān)系返回。

Part2

func minMax(x, y int) (min, max int) {
    if x > y {
        min = y
        max = x

    } else {
        min = x
        max = y
    }

    return min, max
}

在這段代碼中我們?cè)趓eturn 后面指定了返回值 mix,max。 注意改return中 min和max的順序一定要先min,再max,因?yàn)樵摵瘮?shù)中 return并不是按照函數(shù)中的變量名和函數(shù)返回中的變量名對(duì)應(yīng)關(guān)系返回的。

Part3: 即 returnNames.go的最后一段代碼

func main()  {
    arguments := os.Args
    if len(arguments) < 3 {
        fmt.Println("The program needs at least 2 arguments!")
        return
    }

    a1, _ := strconv.Atoi(arguments[1])
    a2, _ := strconv.Atoi(arguments[2])

    fmt.Println(minMax(a1, a2))
    min, max := minMax(a1, a2)
    fmt.Println(min, max)

    fmt.Println(nameMinMax(a1, a2))
    min, max = nameMinMax(a1, a2)
    fmt.Println(min, max)
}

下面執(zhí)行returnNames.go:

$ go run returnNames.go -20 1
-20 1
-20 1
-20 1
-20 1

指針可以作為函數(shù)的參數(shù)

下面以ptrFun.go進(jìn)行講解

package main

import "fmt"

func getPtr(v *float64) float64  {
    return *v * *v
}

func main()  {
    x := 12.2
    fmt.Println(getPtr(&x))
    x = 12
    fmt.Println(getPtr(&x))
}

上面的函數(shù)接收一個(gè)指針作為其參數(shù),你可以使用"&"符號(hào)來(lái)獲得一個(gè)變量的指針(變量的內(nèi)存地址)。
執(zhí)行ptrFun.go

$  go run main.go
148.83999999999997
144

如果你傳入的不是指針,而是常規(guī)的12,即getPtr(12.12),程序回報(bào)下面錯(cuò)誤:

$ go run ptrFun.go
# command-line-arguments
./ptrFun.go:15:21: cannot use 12.12 (type float64) as type *float64 in argument to getPtr

函數(shù)可以返回指針

下面以returnPtr.go為例:

package main

import "fmt"

func returnPtr(x int) *int  {
    y := x * x
    return &y
}

func main()  {
    sq := returnPtr(10)
    fmt.Println("sq:", *sq)  // "*" 用來(lái)獲取存儲(chǔ)在sq內(nèi)存地址中的值
    fmt.Println("sq:", sq) // 該print會(huì)返回sq變量的內(nèi)存地址,而不是int值
}

上面代碼中我們定義了returnPtr函數(shù),該函數(shù)返回一個(gè)init類型的指針。注意我們需要在return后面 &y來(lái)返回y變量的內(nèi)存地址。

$ go run returnPtr.go
sq: 100
sq: 0xc420014088

函數(shù)的返回值可以是函數(shù)

下面以returnFunction.go為例:

package main

import "fmt"

func funReturnFun() func() int  { //該函數(shù)的返回值為匿名函數(shù)
    i := 0
    return func() int {
        i ++
        return  i * i
    }
}

func main()  {
  //下面調(diào)用兩次funReturnFun(),并把他們的返回值(匿名函數(shù))分別賦值給i,j
    //在下面的print中你會(huì)看到i,和 j是兩個(gè)完全獨(dú)立的變量,沒(méi)有任何關(guān)聯(lián) 
    i := funReturnFun()
    j := funReturnFun()

//下面分通過(guò)i()和j()的方式調(diào)用了3次i變量,和2次j變量。
//注意i 和 j 都是通過(guò)調(diào)用 funRetrunFun()函數(shù)創(chuàng)建的,但是他們是完全獨(dú)立的,不會(huì)共享任何東西。也不會(huì)互相干擾
    fmt.Println("1:", i())
    fmt.Println("2", i())
    fmt.Println("j1", j())
    fmt.Println("j2", j())
    fmt.Println("3:", i())

}

下面執(zhí)行returnFunction.go

$ go run returnFunction.go
1: 1
2: 4
j1: 1
j2: 4
3: 9

函數(shù)接收其他函數(shù)作為參數(shù)

下面以funFun.go進(jìn)行講解

package main

import "fmt"

func function1(i int) int  { // 聲明函數(shù)function1
    return i + i
}

func function2(i int) int  { //聲明函數(shù)function2
    return i * i
}

func funFun(f func(int) int,v int ) int {  //該函數(shù)接收一個(gè)函數(shù)作為它的第一個(gè)參數(shù),一個(gè)int類型作為第二個(gè)參數(shù)
    return f(v)   //把函數(shù)的第二個(gè)參數(shù)傳給第一個(gè)參數(shù)函數(shù)
}

func main()  {
    fmt.Println("function1:", funFun(function1, 123)) //funciton1作為functFun的第一個(gè)參數(shù)

    fmt.Println("function2", funFun(function2, 123))  //funciton1作為functFun的第一個(gè)參數(shù)

    fmt.Println("Inline:", funFun(func(i int) int { return i * i * i }, 123)) //一個(gè)函數(shù)作為參數(shù)

運(yùn)行上面的代碼

$ go run funFun.go
function1: 246
function2: 15129
Inline: 1860867

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

當(dāng)前名稱:你可能不知道的一些GoPackages知識(shí)-創(chuàng)新互聯(lián)
鏈接URL:http://www.muchs.cn/article32/dhjopc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開(kāi)發(fā)、網(wǎng)站設(shè)計(jì)面包屑導(dǎo)航、虛擬主機(jī)、品牌網(wǎng)站制作、定制開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作