Go語言宣告函式(function)的方式如下。
Go使用func
關鍵字來宣告函式。
例如下面宣告了兩個函式,main()
及add()
。main()
程式中呼叫add()
並傳入參數1和2。
package main
import "fmt"
func add(x int, y int) int {
return x + y
}
func main() {
result := add(1, 2) // 呼叫add()函式,傳入參數1, 2,取得回傳結果result
fmt.Println(result) // 3
}
Go與C家族語言(e.g: C, C++, Java, C#)的函式差別在於,Go的函式輸入參數的型態是定義在參數名稱後面,且回傳值型態是寫在參數後面。所以上面add()
接收兩個參數x
及y
,型態皆為int
;返回型態為int
。
比對下面Java定義方法add()
的寫法,可以看到參數型態是寫在參數名稱前,返回型態是寫在方法名稱前。
/** Java method */
private int add(int x, int y) {
return x + y;
}
若參數型態相同則型態可合併宣告,例如上面的add()
的兩個參數x
及y
型態皆為int
可合併簡寫如下。
func add(x, y int) int {
return x + y
}
Go的函式可回傳多個值,例如下面half()
回傳兩個string
。
package main
import "fmt"
func half(s string) (string, string) { // 回傳兩個string
n := len(s) // 取得字串s的長度放入變數n
return s[0:n/2], s[n/2:n] // 第一個回傳s前半的字,第二個回傳s後半的字
}
func main() {
a, b := half("直的進去躺著出來") // 用變數a, b接受half()的兩個回傳值。
fmt.Println(a) // 直的進去
fmt.Println(b) // 躺著出來
}
執行印出結果如下。
直的進去
躺著出來
回傳值可以給予名稱,例如修改上面的half()
如下,兩個回傳值名稱分別為firstHalf
及lastHalf
,則相當於在函式頂部宣告了同名的兩個變數且回傳不用指定,會以同名的變數回傳,又稱為naked return。
func half(s string) (firstHalf, lastHalf string) {
n := len(s)
firstHalf = s[0:n/2] // 第一個回傳結果firstHalf
lastHalf = s[n/2:n] // 第二個回傳結果lastHalf
return // 不用指定回傳的變數
}
有命名的回傳相當於下面。
func half(s string) (string, string) {
var firstHalf string
var lastHalf string
n := len(s)
firstHalf = s[0:n/2]
lastHalf = s[n/2:n]
return firstHalf, lastHalf
}
函式也可以function literal的方式定義為匿名函式。
add := func(x, y int) int { // function literal
return x + y
}
fmt.Println(add(1, 2)) // 3
function literal函式若參照外部函式的變數則稱為closure。例如下面add()
參照外部的變數c
。
package main
import "fmt"
func main() {
c := 0
add := func (x, y int) (int, int) {
c++
return x + y, c
}
r, c := add(1, 2)
fmt.Printf("r=%d, c=%d\n", r, c) // r=3, c=1
r, c = add(3, 4)
fmt.Printf("r=%d, c=%d\n", r, c) // r=7, c=2
}
沒有留言:
張貼留言