go語言之進階篇指針類型和普通類型的方法集

用實例value與pointer調用方法(含匿名字段)不受方法集的約束,編譯器總是查找全部方法,並且自動轉換receiver實參

package main

import "fmt"

type Person struct {
  name string //名字
  sex  byte   //性別, 字符類型
  age  int    //年齡
}
//非指針
func (p Person) SetInfoValue() {
  fmt.Println("SetInfoValue")
}
//指針
func (p *Person) SetInfoPointer() {
  fmt.Println("SetInfoPointer")
}

func main() {
  //結構體變量是一個指針變量,它能夠調用哪些方法,這些方法就是一個集合,簡稱方法集
  p := &Person{"mike", 'm', 18}
  p.SetInfoPointer() //func (p *Person) SetInfoPointer()
  (*p).SetInfoPointer() //把(*p)轉換層p後再調用,等價於上面

  //內部做的轉換, 先把指針p, 轉成*p後再調用
  (*p).SetInfoValue()
  p.SetInfoValue()

  //普通變量
  p1 := Person{"mike", 'm', 18}
  p1.SetInfoPointer() //func (p *Person) SetInfoPointer()
  //內部,先把p, 轉爲爲&p再調用,
  (&p1).SetInfoPointer()

  p.SetInfoValue()
}

結果:

GOROOT=E:\software\Go #gosetup
GOPATH=E:\software\Go\GOPATH #gosetup
E:\software\Go\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\___go_build_study_gin.exe study_gin #gosetup
C:\Users\Administrator\AppData\Local\Temp\___go_build_study_gin.exe #gosetup
SetInfoPointer
SetInfoPointer
SetInfoValue
SetInfoValue
SetInfoPointer
SetInfoPointer
SetInfoValue
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章