Go語言學習筆記七: 函數

Go語言學習筆記七: 函數

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的方法。

此係列其餘文章地址

https://github.com/zhangqunshi/golang_study

參考: http://www.runoob.com/go/go-method.html

相關文章
相關標籤/搜索