Golang 方法method


方法method

  • Go中雖沒有class,但依舊有method
  • 通過顯示說明receiver來實現與某個類型的結合
  • 只能為同一個包中的類型定義方法
  • receiver可以是類型的值或者指針
  • 不存在方法重載
  • 可以使用值或指針來調用方法,編譯器會自動完成轉換
  • 從某種意義上來說,方法是函數的語法糖,因為receiver其實就是方法所接收的第一個參數(Method Value vs. Method Expression)
  • 如果外部結構和嵌入結構存在同名方法,則優先調用外部結構的方法
  • 類型別名不會擁有底層類型所附帶的方法
  • 方法可以調用結構中的非公開字段
package main

import (
	"fmt"
)

type A struct {
	Name string
}

type B struct {
	Name string
}

func main() {
	a := A{}
	a.Print()
	b := B{}
	b.Print()
}

//編譯器根據接收者的類型,來判斷它是屬於哪個方法
func (a A) Print() {
	//取一個變量a,a就是接收者,它的接收者的類型就是structA,Print就是方法的名稱,參數在Print()的括號中定義
	//receiver就是這個函數的第一個接收者,而且是強制規定的,這個時候就變成了一個方法
	fmt.Println("A")
}
func (b B) Print() {
	fmt.Println("B")
}

receiver也是參數,涉及到指針傳遞還是值的傳遞

package main

import (
	"fmt"
)

type A struct {
	Name string
}

type B struct {
	Name string
}

func main() {
	a := A{}
	a.Print()
	fmt.Println(a.Name)
	b := B{}
	b.Print()
	fmt.Println(b.Name)
}

//編譯器根據接收者的類型,來判斷它是屬於哪個方法
func (a *A) Print() { //加上*代表指針傳遞
	//取一個變量a,a就是接收者,它的接收者的類型就是structA,Print就是方法的名稱,參數在Print()的括號中定義
	//receiver就是這個函數的第一個接收者,而且是強制規定的,這個時候就變成了一個方法
	a.Name = "AA"
	fmt.Println("A")
}
func (b B) Print() { //這里的b並不是以指針傳遞
	b.Name = "BB"
	fmt.Println("B")
}
//結果所示:值類型不使用指針,在這個方法結束之后,值不會被修改
PS G:\mygo\src\mytest> go run .\temp4.go
A
AA
B

類型別名與方法的組合

package main

import (
	"fmt"
)

type TZ int

func main() {
	var a TZ
	a.Print()

}
func (a *TZ) Print() {
	fmt.Println("TZ")
}

Method Value vs. Method Expression

package main

import (
	"fmt"
)

type TZ int

func main() {
	var a TZ
	a.Print()       //Method Value
	(*TZ).Print(&a) //Method Expression  這是兩種不同的調用方法

}
func (a *TZ) Print() {
	fmt.Println("TZ")
}

方法訪問權限

package main

import (
	"fmt"
)

type A struct {
	mm string //首字母小寫代表私有字段
	//首字母的大小寫還是以包為級別來界定它的公有還是私有
}

func main() {
	a := A{}
	a.Print()
	fmt.Println(a.mm)

}
func (a *A) Print() {
	a.mm = "123"
	fmt.Println(a.mm)
}

//打印結果證明方法當中可以訪問結構當中的私有字段,類似與其他面向對象編程語言當中class中的方法可以訪問其中的私有字段
PS G:\mygo\src\mytest> go run .\temp5.go
123
123


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM