Go的Function方式有幾種
func foo(name string) {
fmt.Println("Hi " + name)
}
其中括號內分別為傳入值名稱、型態,剛好跟許多常見的語言顛倒。如果沒有回傳值就空著,也不用填null, nil之類的
func foo(name1 string, name2 string) {
fmt.Println("Hi " + name1 + ", " + name2)
}
如果兩個值型態相同可以這樣
func foo(name1, name2 string) {
fmt.Println("Hi " + name1 + ", " + name2)
跟很多語言先寫回傳值型態又相反,回傳型態是寫在括號後面的
func foo(name string) string {
var str = "Hi " + name
return str
}
Go可以直接在function的回傳區塊命名回傳變數,同樣括號內前者是名稱,後者是型態,return之後還不用填變數
func foo(name string) (str string) {
str = "Hi " + name
return
}
可以回傳多個值
func foo(x, y int) (int, int) {
return x + y, x - y
}
如果實在不知道該傳入幾個變數也可以這樣
func total(x ...int) int {
var t int
for _, n := range x {
t += n
}
return t
}
關於for的第一個參數為底線是Blank identifier,後面會幫大家介紹
slice是類似矩陣的東西,後面幾篇會介紹
func total(x []int) int {
var t int
for _, n := range x {
t += n
}
return t
}
一個類似變數的寫法
foo := func() {
fmt.Println("Hi " + name)
}
當然這個function的名稱就是foo
上個提到function可以當變數,所以當然也可以用來回傳
func foo() func() string {
return func() string {
return "I don't know what is this mean"
}
}
這個方法我想不到太到有甚麼實質用途,還麻煩高手請教...
下回待續...
關於 return func 我有幾個應用範例
1 例如 return 計算函式
2 建立類似函式內靜態變數
package main
import (
"fmt"
)
func option( op string ) func(a int,b int) int {
swich op {
case "+":
return func(a int,b int) int {
return a+b;
}
// .......
}
}
pack main
func Count_init( num int) int {
count := num
return func() int {
count++
return count
}
}
func main() {
count = Count_init(3)
for j:=10; j>0;j-- {
fmt.Println("count number:" , count() )
}
}