天天看點

Go語言 - 函數/方法

Go語言的函數和方法不是同一個概念。

普通函數:

// 普通函數
func demo0(a, b int) int {
  return a + b
}
// 調用
ret := demo0(1, 2)
fmt.Println(ret)
           
// 匿名函數, 直接調用
func demo1() {
  func(name string) { fmt.Printf("Hi %s\n", name) }("Gooo")
}

// 調用
demo0()
           
// 閉包, x變量有存儲功能
func demo2() func() int {
  var x int = 0
  // 傳回的值func() int, 而這個沒有銷毀的時候,x可以繼續使用
  return func() int {
    x++
    return x * x
  }
}

// 使用
f := demo2()
fmt.Println(f())
fmt.Println(f())
f2 := demo2() // f2和f存儲的是不同的x
fmt.Println(f2())
           
// 結構體
type person struct {
  name string
  age  int8
}
// 方法,指定接收者為persion結構體對象,方法跟函數的聲明差别在于`func`和方法名之前需要指定接收者`(p persion)`
func (p person) sayHi() {
  fmt.Printf("%s say Hi!\n", p.name)
}
// 方法2,接收者為指針類型,允許修改屬性
func (p *person) happyBirthday() {
  p.age++
// 準确來說,應該是下面這樣,但go允許上面的寫法
//(*p).age++
}

// 調用
p := person{"Go", 18}
p.sayHi()
p.happyBirthday()
// 準确來說,應該是下面這樣,但go允許上面的寫法
//(&p).happyBirthday()
fmt.Printf("age = %d", p.age)

// 列印結果:
//Go say Hi!
//age = 19