日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

一文帶你了解Go語言中方法的調用_Golang

作者:陳明勇 ? 更新時間: 2022-12-29 編程語言

前言

在前面的 一文熟悉 Go 函數 文章中,介紹了 Go 函數的聲明,函數的幾種形式如匿名函數、閉包、基于函數的自定義類型和函數參數詳解等,而本文將對方法進行介紹,方法的本質就是函數,介紹方法的同時也會順帶對比其與函數的不同之處。

方法

在 Go 中,我們可以為任何的數據類型定義方法(指針或接口除外),現在讓我們看一看方法的聲明和組成部分以及與函數有什么不同之處。

type Person struct {
	age int
}

func (p *Person) SetAge(age int) error {
	if age < 0 {
		return errors.New("年齡不能小于 0 ")
	}
	p.age = age
	return nil
}

上述代碼定義了一個結構體 Person,此結構體包含一個 age 屬性,一個 SetAge 方法,此方法只作用于 Person 結構體。我們可以看到,該方法包含六部分,分別為:

  • 1、關鍵字 聲明方法時,必須以 func 關鍵字開頭,還記得函數的聲明嗎,也是以這個關鍵字開頭。
  • 2、receiver 部分 (p *Person) 這部分,在 Go 中稱為 receiver 部分,里面的參數稱為 receiver 參數,相比于函數,方法與其的聲明區別就在于多了這一部分。
  • 3、方法名。 Go 推薦使用駝峰命名的方式,和變量的命名規則一樣,首字母大寫的方法名可以在包外訪問,小寫的只能在包內訪問。
  • 4、參數列表 參數列表中聲明了在方法體里所使用到的變量。參數列表位于方法名后面,用括號包裹著,多個參數使用逗號分隔開。
  • 5、返回值列表 返回值為函數執行后的一個結果,上述代碼只有一個返回值,如果有多個返回值,需要用括號包裹著,返回值之間用逗號分隔開。
  • 6、方法體 大括號內就是方法體,存放著方法的具體實現。

方法的調用

通過 變量.方法名(參數) 的方式對方法進行調用。例如:

import (
	"errors"
	"fmt"
)

type Person struct {
	age int
}

func (p *Person) SetAge(age int) error {
	if age < 0 {
		return errors.New("年齡不能小于 0 ")
	}
	p.age = age
	return nil
}

func main() {
	person := Person{}
	err := person.SetAge(18)
	if err != nil {
		return
	}
	fmt.Println(person.age) // 18
}

創建一個 person 變量,然后調用 SetAge 函數。

Receiver 參數類型的選擇

Receiver 部分,我們可以綁定值類型,也可以綁定指針類型,這兩種類型什么時候使用呢?

如果方法體里不涉及到修改結構體變量的屬性值,使用值類型

type Person struct {
        age int
}

func (p Person) GetAge() int {
        return p.age
}

對于 GetAge 方法,作用是返回年齡,沒有涉及到修改年齡的操作,因此 receiver 部分,選擇 Person 類型就可以。

如果方法體里有修改結構體變量的屬性值的操作,使用指針類型

type Person struct {
	age int
}

func (p *Person) SetAge(age int) error {
	if age < 0 {
		return errors.New("年齡不能小于 0 ")
	}
	p.age = age
	return nil
}

SetAge 涉及到對結構體屬性值修改的操作,因此 receiver 部分使用指針類型,通過指針,可以對所指向地址的變量進行修改操作。

方法的約束

Go 對方法聲明的位置是有約束的,我們不能跨越包去聲明一個類型的方法,根據這個特點我們可以發現:

不能為基本數據類型聲明方法

因為基本數據類型所定義的位置,是不在我們所編碼的包里面的。

不能跨越包為其他包的類型聲明方法

這個是 Go 的所規定的的。

小結

本文介紹了 Go 方法的聲明方式、組成部分和其與函數的不同點,同時指出Receiver 參數類型在不同場景下的選擇,最后介紹了 Go 對方法約束的體現。

原文鏈接:https://juejin.cn/post/7172208177314791455

欄目分類
最近更新