目錄
函數
方法
Go语言中方法和函数的区别
首頁 後端開發 Golang go語言中方法和函數的差別是什麼

go語言中方法和函數的差別是什麼

Jan 03, 2023 am 11:23 AM
golang go語言

區別:1、函數function是一段具有獨立功能的程式碼,可以被反覆多次調用,從而實現程式碼復用;而方法method是一個類別的行為功能,只有該類別的物件才能調用。 2、方法有接受者,而函數無接受者。 3.函數不可以重名,而方法可以重新命名。 4.調用方式不一樣。 5.方法需要指定所屬類型,可以是結構體也可以是自訂type,函數則通用。 6.函數的形參與傳參類型需要一致,方法可以改變。

go語言中方法和函數的差別是什麼

本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。

在Go語言中,函數和方法不太一樣,有明確的概念區分。其他語言中,如Java,一般來說,函數就是方法,方法就是函數,但是在Go語言中,函數是指不屬於任何結構體、類型的方法,也就是說,函數是沒有接收者的;而方法是有接收者的,我們說的方法要麼是屬於一個結構體的,要麼屬於一個新定義的類型的。

函數

函數和方法,雖然概念不同,但定義非常相似。函數的定義宣告沒有接收者,所以我們直接在go檔案裡,go包之下定義宣告即可。在

func main() {
    sum := add(1, 2)
    fmt.Println(sum)
}

func add(a, b int) int {
    return a + b
}
登入後複製

例子中,我們定義了add就是一個函數,它的函數簽章是func add(a, b int) int,沒有接收者,直接定義在go的一個套件之下,可以直接調用,例如範例中的main函數調用了add函數。

範例中的這個函數名稱是小寫開頭的add,所以它的作用域只屬於所宣告的套件內使用,不能被其他套件使用,如果我們把函數名稱以大寫字母開頭,函數的作用域就大了,可以被其他套件呼叫。這也是Go語言中大小寫的用處,例如Java中,就有專門的關鍵字來宣告作用域privateprotectpublic等。

/*
 提供的常用库,有一些常用的方法,方便使用
*/
package lib

// 一个加法实现
// 返回a+b的值
func Add(a, b int) int {
    return a + b
}
登入後複製

如上範例中定義的Add方法就可以被其他套件呼叫。

方法

方法的宣告和函數類似,他們的差異是:方法在定義的時候,會在func和方法名之間增加一個參數,這個參數就是接收者,這樣我們定義的這個方法就和接收者綁定在了一起,稱為這個接收者的方法。

type person struct {
    name string
}

func (p person) String() string{
    return "the person name is "+p.name
}
登入後複製

留意例子中,func和方法名稱之間增加的參數(p person),這個就是接收者。現在我們說,類型person有了一個String方法,現在我們看如何使用它。

func main() {
    p:=person{name:"张三"}
    fmt.Println(p.String())
}
登入後複製

呼叫的方法非常簡單,使用類型的變數進行呼叫即可,類型變數和方法之前是一個.操作符,表示要呼叫這個類型變數的某個方法的意思。

Go語言裡有兩種類型的接收者:值接收者和指標接收者。在我們上面的例子中,就是使用值類型接收者的範例。

使用值類型接收者定義的方法,在呼叫的時候,使用的其實是值接收者的副本,所以對該值的任何操作,不會影響原來的型別變數。

func main() {
    p:=person{name:"张三"}
    p.modify() //值接收者,修改无效
    fmt.Println(p.String())
}

type person struct {
    name string
}

func (p person) String() string{
    return "the person name is "+p.name
}

func (p person) modify(){
    p.name = "李四"
}
登入後複製

以上的例子,列印出來的值還是張三,對其進行的修改無效。如果我們使用指標作為接收者,那麼就會其作用了,因為指標接收者傳遞的是一個指向原值指標的副本,指標的副本,指向的還是原來類型的值,所以修改時,同時也會影響原來類型變數的值。

func main() {
    p:=person{name:"张三"}
    p.modify() //指针接收者,修改有效
    fmt.Println(p.String())
}

type person struct {
    name string
}

func (p person) String() string{
    return "the person name is "+p.name
}

func (p *person) modify(){
    p.name = "李四"
}
登入後複製

只需要改動一下,變成指標的接收者,就可以完成了修改。

在呼叫方法的時候,傳遞的接收者本質上都是副本,只不過一個是這個值副本,一是指向這個值指標的副本。指標具有指向原有值的特性,所以修改了指標指向的值,也就修改了原有的值。我們可以簡單的理解為值接收者使用的是值的副本來呼叫方法,而指標接收者使用實際的值來呼叫方法。

在上面的例子中,有沒有發現,我們在呼叫指標接收者方法的時候,使用的也是一個值的變量,並不是一個指針,如果我們使用下面的也是可以的。

p:=person{name:"张三"}
(&p).modify() //指针接收者,修改有效
登入後複製

這樣也是可以的。如果我們沒有這麼強制使用指針進行調用,Go的編譯器自動會幫我們取指針,以滿足接收者的要求。

同樣的,如果是一個值接收者的方法,使用指標也是可以呼叫的,Go編譯器會自動會解引用,以滿足接收者的要求,例如例子中定義的String( )方法,也可以這麼調用:

p:=person{name:"张三"}
fmt.Println((&p).String())
登入後複製

總之,方法的調用,既可以使用值,也可以使用指針,我們不必要嚴格的遵守這些,Go語言編譯器會幫我們進行自動轉義的,這大大方便了我們開發者。

不管是使用值接收者,还是指针接收者,一定要搞清楚类型的本质:对类型进行操作的时候,是要改变当前值,还是要创建一个新值进行返回?这些就可以决定我们是采用值传递,还是指针传递。

Go语言中方法和函数的区别

1、含义不同

函数function是一段具有独立功能的代码,可以被反复多次调用,从而实现代码复用。而方法method是一个类的行为功能,只有该类的对象才能调用。

2、方法有接受者,而函数无接受者

  • Go语言的方法method是一种作用于特定类型变量的函数,这种特定类型变量叫做Receiver(接受者、接收者、接收器);

  • 接受者的概念类似于传统面向对象语言中的this或self关键字;

  • Go语言的接受者强调了方法具有作用对象,而函数没有作用对象;

  • 一个方法就是一个包含了接受者的函数;

  • Go语言中, 接受者的类型可以是任何类型,不仅仅是结构体, 也可以是struct类型外的其他任何类型。

3、函数不可以重名,而方法可以重名

只要接受者不同,则方法名可以一样。

4、调用方式不一样

方法是struct对象通过.点号+名称来调用,而函数是直接使用名称来调用。

方法的调用需要指定类型变量调用,函数则不需要

 ```
var p testMethod.Person
p.Name = "tom"
p.Age = 123
p.ShowInfo()
登入後複製

注:方法和函数的访问权限都受大小写影响,小写本包,大写全局

5、方法需要指定所属类型,可以是结构体也可以是自定义type,函数则通用

```
func (person Person) ShowInfo(形参) 返回值{

   person.Name = "123"
   person.Age = 12
   fmt.Printf("name=%v,age=%v",person.Name,person.Age)
}
```
 
person为类型的形参,类型为Person
登入後複製

6、函数的形参与传参类型需要一致,方法可以改变

     ```
func (person *Person) ShowInfo(形参) 返回值{

   person.Name = "123"
   person.Age = 12
   fmt.Printf("name=%v,age=%v",person.Name,person.Age)
}
登入後複製

(1)这里方法的类型形参为指针,调用时可以使用 p.ShowInfo()或者 (&p).ShowInfo(),本质上都是后者,只不过Go的设计者对于方法的调用做了底层优化

func (person Person) ShowInfo(形参) 返回值{

   person.Name = "123"
   person.Age = 12
   fmt.Printf("name=%v,age=%v",person.Name,person.Age)
}
登入後複製

(2)这里方法的形参类型为数值型,默认为值传递,而在调用时可以使用p.ShowInfo()或者 (&p).ShowInfo(),但依旧是值拷贝

func test01(i *int) {


}
登入後複製

(3)对于函数则需保持一致,需要的形参为指针,则传入的形参需为地址值,否则编译无法通过

【相关推荐:Go视频教程编程教学

以上是go語言中方法和函數的差別是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
在Go語言中使用Redis Stream實現消息隊列時,如何解決user_id類型轉換問題? 在Go語言中使用Redis Stream實現消息隊列時,如何解決user_id類型轉換問題? Apr 02, 2025 pm 04:54 PM

Go語言中使用RedisStream實現消息隊列時類型轉換問題在使用Go語言與Redis...

GoLand中自定義結構體標籤不顯示怎麼辦? GoLand中自定義結構體標籤不顯示怎麼辦? Apr 02, 2025 pm 05:09 PM

GoLand中自定義結構體標籤不顯示怎麼辦?在使用GoLand進行Go語言開發時,很多開發者會遇到自定義結構體標籤在�...

Go語言中哪些庫是由大公司開發或知名的開源項目提供的? Go語言中哪些庫是由大公司開發或知名的開源項目提供的? Apr 02, 2025 pm 04:12 PM

Go語言中哪些庫是大公司開發或知名開源項目?在使用Go語言進行編程時,開發者常常會遇到一些常見的需求,�...

Golang的目的:建立高效且可擴展的系統 Golang的目的:建立高效且可擴展的系統 Apr 09, 2025 pm 05:17 PM

Go語言在構建高效且可擴展的系統中表現出色,其優勢包括:1.高性能:編譯成機器碼,運行速度快;2.並發編程:通過goroutines和channels簡化多任務處理;3.簡潔性:語法簡潔,降低學習和維護成本;4.跨平台:支持跨平台編譯,方便部署。

在Go編程中,如何正確管理Mysql和Redis的連接與釋放資源? 在Go編程中,如何正確管理Mysql和Redis的連接與釋放資源? Apr 02, 2025 pm 05:03 PM

Go編程中的資源管理:Mysql和Redis的連接與釋放在學習Go編程過程中,如何正確管理資源,特別是與數據庫和緩存�...

Golang vs. Python:性能和可伸縮性 Golang vs. Python:性能和可伸縮性 Apr 19, 2025 am 12:18 AM

Golang在性能和可擴展性方面優於Python。 1)Golang的編譯型特性和高效並發模型使其在高並發場景下表現出色。 2)Python作為解釋型語言,執行速度較慢,但通過工具如Cython可優化性能。

多進程日誌寫入如何保證並發安全又高效? 多進程日誌寫入如何保證並發安全又高效? Apr 02, 2025 pm 03:51 PM

高效處理多進程日誌寫入的並發安全問題多進程同時寫入同一個日誌文件,如何保證並發安全且高效?這是一個...

Golang和C:並發與原始速度 Golang和C:並發與原始速度 Apr 21, 2025 am 12:16 AM

Golang在並發性上優於C ,而C 在原始速度上優於Golang。 1)Golang通過goroutine和channel實現高效並發,適合處理大量並發任務。 2)C 通過編譯器優化和標準庫,提供接近硬件的高性能,適合需要極致優化的應用。

See all articles