Golang理解 函式變數

2022-09-15 11:30:18 字數 2811 閱讀 4044

函式變數是把函式作為值儲存到變數中.

在golang中,,函式也是一種型別,可以和其他型別一樣被儲存在變數中.例如:

package main

// 將函式作為值儲存到變數中

import (

"fmt"

)func fire()

func main()

我們經常選擇乙個方法,並且在同乙個表示式裡執行,比如常見的p.distance()形式,實際上將其分成兩步來執行也是可能的。

p.distance叫作「選擇器」,選擇器會返回乙個方法"值"->乙個將方法(point.distance)繫結到特定接收器變數的函式。

這個函式可以不通過指定其接收器即可被呼叫;即呼叫時不需要指定接收器(譯註:因為已經在前文中指定過了),只要傳入函式的引數即可:

p := point

q := point

distancefromp := p.distance // method value

fmt.println(distancefromp(q))

當你根據乙個變數來決定呼叫同乙個型別的哪個函式時,方法表示式就顯得很有用了。你可以根據選擇來呼叫接收器各不相同的方法。

下面的例子,變數op代表point型別的addition或者subtraction方法,path.translateby方法會為其path陣列中的每乙個point來呼叫對應的方法

package main

import "fmt"

type point struct

func (p point) add(q point) point

}func (p point) sub(q point) point

}type path point

func (p path) translateby(offset point, add bool) path else

for i := range p

return p

}func main()

q := point

path := path, , }

fmt.printf("%#v\n", path.translateby(q, true))

}

鏈式呼叫是乙個泛概念,到底是什麼東西的鏈式呼叫不明確。

函式的返回值是乙個函式時,函式也能鏈式呼叫;

函式的返回值是乙個物件時,直接呼叫返回值中物件的方法也是鏈式呼叫。

但是前者(1)顯然是沒有意義的。真正有意義的鏈式呼叫是後者(2),也就是方法鏈(method chaining)。方法鏈這個詞是有的,而且使用的很廣泛。其實很多人口中的鏈式呼叫實際上就是指方法鏈。但是鏈式呼叫這個詞語還可以描述函式呼叫鏈,所以讓它自身的存在價值變得難以理解。

鏈式呼叫的優點:

讓呼叫過程更接近自然語言。

把原本引數列表複雜的方法化作多個引數列表簡單的方法來使用。

減少不必要的**量。

上面引用至

在jquery中很多東西就是使用了方法鏈的概念,那麼在golang中鏈式呼叫是怎麼樣的呢?

例項:字串的鏈式處理

鏈式呼叫很好的體現了: 操作與資料分離的設計

字串處理函式(stringproccess)需要外部提供資料來源: 乙個字串切片(list string), 另外還需要提供乙個鏈式處理函式的切片(chain func(string) string)

字串鏈式處理設計思路:

這種處理函式能夠接受乙個字串輸入,處理後輸出

strings.tolower()函式能夠將傳入的字串的每個字元變為小寫 func tolower(s string) string

字串處理函式stringproccess內部遍歷每個資料來源提供的字串,每個字串都要經過一系列鏈式處理後重新返回切片

package main

import (

"fmt"

"strings"

)// stringproccess 字串處理函式,傳入字串切片和處理鏈

func stringproccess(list string, chain func(string) string)

// 將結果放回切片

list[index] = result

}}// 自定義處理函式

// 處理鏈函式即可以是系統提供的處理函式,也可以使用自定義的函式

// 自定義移除字首的處理函式

func removeprefix(str string) string

func main()

// 處理函式鏈

chain := func(string) string

// 處理字串

stringproccess(list, chain)

// 輸出處理好的字串

for _, str := range list

}

鏈式處理器是一種常見的程式設計設計.netty是使用j**a語言編寫的一款非同步事件驅動的網路應用程式框架,

支援快速開發可維護的高效能的面向協議的伺服器和客戶端,netty中就有類似的鏈式處理器的設計.

鏈式處理的開發思想將資料和操作拆分,解耦,讓開發者可以根據自己的技術優勢和需求,進行系統開發,同時將自己的開發成果共享給其他的開發

Golang 定義變數

golang 定義變數 golang的變數可以由字母數字和下劃線組成,但是首字元不能為數字。golang是靜態型別語言,變數必須宣告型別。定義變數使用 var 關鍵字。變數小知識 在golang當中如果只是宣告了變數,但是並沒有使用這個變數的話,會提示乙個declared and not used的...

golang變數和常量

1.變數宣告 var 關鍵字 變數名稱 基礎型別 或自定義型別 例如 var name int var naem1 10 int 陣列 var name2 int 切片 var name3 int 指標 var name4 map string int map,key為string型別,value為...

golang學習(2) 變數

任何一門語言中最基礎的就是變數了,如果把記憶體比為一格一格整體排列的儲物箱,那麼變數就是每個儲物箱的標識,我們通過變數來訪問計算機記憶體。關於定義變數的三種方式 1.package main import fmt func main 1 第二種 前面使用了 var 關鍵字,它就是用來顯式定義變數的。...