標籤:return 命名 就是 屬性 www. 表達 method parameter result
Go語言學習筆記七: 函數
Go語言有函數還有方法,神奇不。這有點像python了。
函數定義
func function_name( [parameter list] ) [return_types] { 函數體}
舉個例子:
/* 函數返回兩個數的最大值 */func max(num1, num2 int) int { /* 聲明局部變數 */ var result int if (num1 > num2) { result = num1 } else { result = num2 } return result }
函數調用
var a int = 1var b int = 2var c intc = max(a, b)
函數可以返回多個值
func swap(x, y string) (string, string) { return y, x}func main() { a, b := swap("hello", "kris") fmt.Println(a, b)}
是不是有點像python.
值傳遞
傳遞是指在調用函數時將實際參數複製一份傳遞到函數中,這樣在函數中如果對參數進行修改,將不會影響到實際參數。
基礎類型都是值傳遞,地球人都知道。
引用傳遞
引用傳遞是指在調用函數時將實際參數的地址傳遞到函數中,那麼在函數中對參數所進行的修改,將影響到實際參數。
func swap(x *int, y *int) { var temp int temp = *x /* 保持 x 地址上的值 */ *x = *y /* 將 y 值賦給 x */ *y = temp /* 將 temp 值賦給 y */}
天呀,我感覺自己又回到了上學時代。(感覺自己好年輕)
函數作為值
Go 語言可以很靈活的建立函數,並作為值使用。
func main(){ /* 聲明函數變數 */ getSquareRoot := func(x float64) float64 { return math.Sqrt(x) } /* 使用函數 */ fmt.Println(getSquareRoot(9))}
是不是感覺像javascript語言。
閉包
Go 語言支援匿名函數,可作為閉包。匿名函數是一個"內聯"語句或運算式。匿名函數的優越性在於可以直接使用函數內的變數,不必申明。
func getSequence() func() int { i := 0 return func() int { i += 1 return i }}func main() { next := getSequence() fmt.Println(next()) fmt.Println(next())}
這個寫法太。。。完美(真趕時髦)。我猜 func() int
是閉包的傳回值。
方法
Go 語言中同時有函數和方法。一個方法就是一個包含了接受者的函數,接受者可以是命名類型或者結構體類型的一個值或者是一個指標。所有給定類型的方法屬於該類型的方法集。
func (variable_name variable_data_type) function_name() [return_type]{ /* 函數體*/}
舉個例子:
/* 定義結構體 */type Circle struct { radius float64}func main() { var c1 Circle c1.radius = 10.00 fmt.Println("Area of Circle(c1) = ", c1.getArea())}//該 method 屬於 Circle 類型對象中的方法func (c Circle) getArea() float64 { //c.radius 即為 Circle 類型對象中的屬性 return 3.14 * c.radius * c.radius}
感覺寫法很彆扭,Circle給我的感覺就是一個Java的類,而getArea()是這個類的方法。估計只要在函數前面加上(c Circle)
的都是屬於c的方法。
此系列其他文章地址
https://github.com/zhangqunshi/golang_study
參考: http://www.runoob.com/go/go-method.html
Go語言學習筆記七: 函數