Go語言有函數還有方法,神奇不。這有點像python了。javascript
func function_name( [parameter list] ) [return_types] { 函數體 }
舉個例子:html
/* 函數返回兩個數的最大值 */ func max(num1, num2 int) int { /* 聲明局部變量 */ var result int if (num1 > num2) { result = num1 } else { result = num2 } return result }
var a int = 1 var b int = 2 var c int c = 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.java
傳遞是指在調用函數時將實際參數複製一份傳遞到函數中,這樣在函數中若是對參數進行修改,將不會影響到實際參數。python
基礎類型都是值傳遞,地球人都知道。git
引用傳遞是指在調用函數時將實際參數的地址傳遞到函數中,那麼在函數中對參數所進行的修改,將影響到實際參數。github
func swap(x *int, y *int) { var temp int temp = *x /* 保持 x 地址上的值 */ *x = *y /* 將 y 值賦給 x */ *y = temp /* 將 temp 值賦給 y */ }
天呀,我感受本身又回到了上學時代。(感受本身好年輕)golang
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的方法。