go語言中結構體方法的定義方法:1、定義一個結構體,語法「type point struct {....}」;2、將結構體作為接收者來定義結構體方法,語法「func (接收者變數接收者類型) 方法名稱(參數清單)(傳回值清單){//方法體}」。 Go語言中,接收者的類型可以是任何類型,不只是結構體,也可以是struct類型外的任何類型。
本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。
Go語言同時有函數和方法,方法的本質是函數,但是方法和函數又有不同點。
函數function是一段具有獨立功能的程式碼,可以重複多次調用,從而實現程式碼重複使用。
方法method是一個類別的行為功能,只有該類別的物件才能呼叫。
Go語言的方法method是作用於特定型別變數的函數。這種特定類型的函數叫做Receiver
接收者的概念類似於傳動物件導向語言中的this或self關鍵字。
Go語言的接收者強調了方法具有作用對象,而函數沒有作用對象。
Go語言中,接收者的型別可以是任何型別,不只是結構體,也可以是struct型別外的任何型別。 (如整形、字串、slice、map、甚至函數等)
只要接收者不同,則方法名稱可以一樣。
有重寫方法無重載方法(不支援重載方法,也就是說,不能定義名字相同但是不同參數的方法)
接收者可以是struct型別或非struct型,可以是指標型別和非指標型別。
接收者中的變數在命名時,官方建議使用接收者類型的第一個小寫字母。
// 定义方法的语法格式: func (接收者变量 接收者类型) 方法名(参数列表) (返回值列表){ //方法体 } // 定义结构体 type point struct { X int Y int } // 定义结构体方法 func (p point) print() { fmt.Println(p.X, p.Y) }
#go函數會複製每一個實參變數,如果一個實參太大而我們希望避免複製整個實參,可以使用指標來傳遞變數的位址。
指標接收者在呼叫方法的時候,編譯器會對變數進行隱含轉換。
type point struct { X int Y int } func (p point) Print() { fmt.Println(p.X, p.Y) } func (p *point) ScaleBy(factor int) { p.X *= factor p.Y *= factor } func main() { p := point{1,1} ptr := &p p.Print() //1. 正确 ptr.Print() //2. 正确 p.ScaleBy(2) //3. 正确 ptr.ScaleBy(2) //4. 正确 point{1,1}.Print() //5. 正确 (&point{1,1}).Print() //6. 正确 (&point{1,1}).ScaleBy( 2) //7. 正确 point{1,1}.ScaleBy( 2) //8. 错误 }
nil是一個合法的接收者:就像一些函數允許nil指標作為實參,方法的接收者允許是nil指標
// 定义结构体 type A struct { Data int } // 定义结构体方法 func (a *A) FunPtrA() { fmt.Println("FunPtrA") } func main() { // 声明结构体变量 var ptrA *A // 将 nil 赋值给结构体变量 ptrA = nil // 调用结构体方法 ptrA.FunPtrA() //FunPtrA }
// 声明 human 结构体 type human struct { name, phone string age int8 } // student 继承 human 结构体 所以继承 human 的方法 type student struct { human school string } // employee 继承 human 结构体 所以继承 human 的方法 type employee struct { human company string } // human 定义 sayHi 方法 func (h human) sayHi() { fmt.Printf("我是%s,年龄%d,联系方式%s \n", h.name, h.age, h.phone) } // 方法的继承 func testMethod11(){ // student 继承 human 所以有 sayHi 方法, employee 同理 s1 := student{human{"s1","138001",13},"第一中学"} e1 := employee{human{"e1","138002",30},"第一企业"} s1.sayHi() //我是s1,年龄13,联系方式138001 e1.sayHi() //我是e1,年龄30,联系方式138002 } // 方法的重写 此为重写 非重载 func (s student) sayHi(){ fmt.Printf("我是%s,年龄%d,我在%s上学,联系方式%s \n", s.name, s.age, s.school,s.phone) } func testMethod12(){ s1 := student{human{"s1","138001",13},"第一中学"} s1.sayHi() //我是s1,年龄13,我在第一中学上学,联系方式138001 }
//面向过程 func Add01(a, b int) int { return a + b } //面向对象,方法:给某个类型绑定一个函数 type long int //tmp叫接收者,接收者就是传递的一个参数 func (tmp long) Add02(other long) long { return tmp + other } func main() { var result int result = Add01(1, 2) //普通函数调用方式 fmt.Println("result = ", result) //定义一个变量 var a long = 2 //调用方式格式: 变量名,函数(所需参数) r := a.Add02(2) fmt.Println("r = ", r) }
以上是go語言中結構體方法怎麼定義的詳細內容。更多資訊請關注PHP中文網其他相關文章!