方法
- 基本介紹
- 方法的宣告
- 方法快速入門案例
- 方法的呼叫和傳參機制原理
- 方法和函式的區別
- 方法使用的注意事項
基本介紹
在某些情況下,我們需要宣告(定義)方法,比如Person結構體:除了有一些欄位外,Person結構體還有一些行為比如:可以說話,跑步,通過學習,還可以做算術題,這是就要用方法才能完成,
Golang中的方法是作用在指定的資料型別上的(即:和指定的資料型別系結),因此自定義型別都可以有方法,而不僅僅是struct,
方法的宣告
func (receiver type)methodName(引數串列)(回傳值串列){
方法體
return 回傳值
}
說明:
- 引數串列:表示方法輸入
- receiver type:表示這個方法和type這個型別進行系結,或者說該方法作用于type.
- receiver type:type可以是結構體,也可以是其他的自定義型別,
- receiver:就是type型別的一個變數(實體),比如:Person結構體的一個變數,
- 回傳值串列:表示回傳的值,可以是多個,
- 方法主體:表示為了實作某一功能的代碼塊,
- return 陳述句不是必須的,
方法快速入門案例
package main
import(
"fmt"
)
type Person struct {
name string
age int
}
//給Person結構體添加一個方法,輸出個人基本資訊
func (p Person) introduce(){
fmt.Printf("大家好,我是%v,今年%v歲\n",p.name,p.age)
}
//給Person結構體添加一個cal方法,可以接受一個數n,計算1+2+3+...+n的值
func (p Person) cal(n int) {
res := 0
for i := 1; i <= n; i++{
res += i
}
fmt.Println(p.name,"計算的結果 =", res)
}
//給person結構體添加getSum方法,可以計算兩個數的和,并回傳結果
func (p Person) getSum(n1 int, n2 int) int{
return n1 + n2
}
func main() {
var p Person
p.name = "Casey"
p.age = 21
//方法的呼叫
p.introduce()
p.cal(100)
res := p.getSum(10,30)
fmt.Println("res =", res)
}
運行結果:

方法的呼叫和傳參機制原理
方法的呼叫和傳參機制和函式基本一樣,不一樣的地方是方法呼叫時,會將呼叫方法的變數,當做實參也傳遞給方法,下面舉例說明:
案例1:
getSum方法的執行程序和說明,
//給person結構體添加getSum方法,可以計算兩個數的和,并回傳結果
func (p Person) getSum(n1 int, n2 int) int{
return n1 + n2
}
func main() {
var p Person
n1 := 10
n2 := 20
res := p.getSum(n1,n2)
fmt.Println("res =", res)
}

說明:
- 在通過一個變數去呼叫方法時,其呼叫機制和函式一樣,
- 不一樣的地方是,變數呼叫方法時,該變數本身也會作為一個引數傳遞到方法(如果變數時值型別,則進行值拷貝,如果是參考型別,則進行地址拷貝)
方法和函式的區別
- 呼叫方式不一樣,函式的呼叫方式:函式名(實參串列),方法的呼叫方式:變數.方法名(實參串列)
- 對于普通函式,接收者為值型別時,不能講指標型別的資料直接傳遞,反之亦然,
//不能接收指標型別的資料
func test1(p Person){
fmt.Println(p.name)
}
func test2(p *Person){
fmt.Println(p.name)
}
func main() {
p := Person{
name : "Tome",
age : 18,
}
test1(p)
test2(&p)
}
- 對于方法(如struct的方法),接收者為值型別是,可以直接用指標型別的變數呼叫方法,
//不能接收指標型別的資料
func (p Person)test1(){
fmt.Println(p.name)
}
func (p *Person) test2(){
fmt.Println(p.name)
}
func main() {
p := Person{
name : "Tom",
age : 18,
}
p.test1()
p.test2()
//從形式上是傳入地址,但本質上仍然是值拷貝
(&p).test1()
(&p).test2()
}
方法使用的注意事項
- 結構體型別是值型別,在方法呼叫中,遵守值型別的傳遞機制,是值拷貝傳遞方法,
- Golang中的方法作用在指定的資料型別上(即:和指定的資料型別系結),因此自定義型別,都可以有方法,而不僅僅是struct,比如int float32等都可以有方法,
type integer int
func (i integer) print(){
fmt.Println("i =",i)
}
func (i *integer) change(){
*i = *i + 1
}
func main() {
var i integer = 10
i.print()
i.change()
fmt.Println("i =",i)
}
運行結果:

- 方法的訪問范圍控制的規則,和函式一樣,方法名首字母小寫,只能在本包訪問,方法首字母大寫,可以在本包和其它包訪問,
- 如果一個型別實作了String()這個方法,那么fmt.Prinfln默認會呼叫這個變數的String()進行輸出,
package main
import(
"fmt"
)
type Person struct {
name string
age int
}
func (p Person) String()string{
str := fmt.Sprintf("name = %v,age = %v\n",p.name,p.age)
return str
}
func main() {
p := Person{
name : "casey",
age : 21,
}
fmt.Println(p)
}
運行結果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/264523.html
標籤:其他
