詳解Go 中方法與函數的區別
Go## 中方法與函數的區別,希望幫助對需要的朋友有所不同!
Go中廣泛使用了函數和方法來提供抽象,使我們的程式更易於閱讀和推理。從表面上來看,函數和方法看起來都相似的,但是存在一些重要的語義差異,這些差異可能會極大地影響程式碼的可讀性。
語法
聲明語法
透過指定參數的類型、傳回值和函數主體來宣告函數:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">type Person struct {
Name string
Age int
}
// 这个函数返回一个新的对象`Person`
func NewPerson(name string, age int) *Person {
return &Person{
Name: name,
Age: age,
}
}</pre><div class="contentsignin">登入後複製</div></div>
另一方面,透過額外指定「接收者」(在OOP術語中將是該方法所屬的「類別class」)來宣告方法:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">// `Person`指针类型接收者的`isAdult方法
func (p *Person) isAdult() bool {
return p.Age > 18
}</pre><div class="contentsignin">登入後複製</div></div>
在上面的方法宣告中,我們在
類型上宣告了
isAdult方法。
執行語法
函數呼叫使用獨立的參數,方法呼叫使用接收者類型。 p := NewPerson("John", 21)
fmt.Println(p.isAdult())
// true
函數與方法
在
理論上可以互換。例如,我們可以將
方法轉換為函數,並將
NewPerson函數作為方法:
type PersonFactory struct {} // NewPerson现在是PersonFactory结构的方法 func (p *PersonFactory) NewPerson(name string, age int) *Person { return &Person{ Name: name, Age: age, } } // 现在,isAdult是一个函数,在该函数中,我们将`Person`作为参数而不是接收者进行传递 func isAdult(p *Person) bool { return p.Age > 18 }
在這種情況下,執行語法看起來有些奇怪:
factory := &PersonFactory{} p := factory.NewPerson("John", 21) fmt.Println(isAdult(p)) // true
上面的程式碼看起來比需要的要複雜得多。這向我們表明,方法和函數的差異主要是語法上的差異,應該根據場景使用適當的抽象。
用例
讓我們來看看Go應用程式中遇到的一些常見用例,以及適用於每個應用程式的適當抽象(函數或方法):#方法鏈
方法的一個非常有用的功能是能夠將它們連結在一起,同時仍保持程式碼的清潔。讓我們以設定
Person使用連結的某些屬性為例:
type Person struct { Name string Age int } func (p *Person) withName(name string) *Person { p.Name = name return p } func (p *Person) withAge(age int) *Person { p.Age = age return p } func main() { p := &Person{} p = p.withName("John").withAge(21) fmt.Println(*p) // {John 21} }
如果我們將函數用於同一件事,那將看起來非常可怕:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">p = withName(withAge(p, 18), "John")</pre><div class="contentsignin">登入後複製</div></div>
有狀態與無狀態執行
在 可互換性 範例中,我們看到了使用PersonFactory
物件來建立Person的新實例。事實證明,這是一種反模式,應避免使用。
最好使用這裡的「無狀態」是指任何總是為同一輸入傳回相同輸出的程式碼NewPerson
先前宣告的函數之類的函數進行無狀態執行。
推論是,如果您發現函數讀取並修改了許多特定類型的值,則它可能應該定義成該類型的方法。
語意語意是指程式碼的閱讀方式。如果你用口語大聲朗讀程式碼,那麼哪個更有意義?
我們來看看isAdult
的函數和方法實作<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">customer := NewPerson("John", 21)
// Method
customer.isAdult()
// Function
isAdult(customer)</pre><div class="contentsignin">登入後複製</div></div>
在這裡 customer.isAdult() 對於詢問「顧客是否是成年人?」的理解比
好很多。此外,當你問「x 是成年人嗎?」時,總是會在
x 的上下文中被問到。結論
儘管我們討論了 Go 中函數和方法的一些關鍵區別和用例,但總會有例外!重要的是,不要將任何這些規則都作為基本原則。 最後,函數和方法之間的差異在於結果程式碼的讀取方式。如果您或您的團隊認為一種方法讀起來比另一種方法更好,那麼這就是正確的抽象!原文網址:https://www.sohamkamani.com/golang/functions-vs-methods/######翻譯網址:https://learnku.com/go/t /52424######
以上是詳解Go 中方法與函數的區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

熱門話題

在Go中安全地讀取和寫入檔案至關重要。指南包括:檢查檔案權限使用defer關閉檔案驗證檔案路徑使用上下文逾時遵循這些準則可確保資料的安全性和應用程式的健全性。

如何為Go資料庫連線配置連線池?使用database/sql包中的DB類型建立資料庫連線;設定MaxOpenConns以控制最大並發連線數;設定MaxIdleConns以設定最大空閒連線數;設定ConnMaxLifetime以控制連線的最大生命週期。

如何在Golang單元測試中使用Gomega進行斷言在Golang單元測試中,Gomega是一個流行且功能強大的斷言庫,它提供了豐富的斷言方法,使開發人員可以輕鬆驗證測試結果。安裝Gomegagoget-ugithub.com/onsi/gomega使用Gomega進行斷言以下是使用Gomega進行斷言的一些常用範例:1.相等斷言import"github.com/onsi/gomega"funcTest_MyFunction(t*testing.T){

GoLang框架與Go框架的差異體現在內部架構與外部特性。 GoLang框架基於Go標準函式庫,擴充其功能,而Go框架由獨立函式庫組成,以實現特定目的。 GoLang框架更靈活,Go框架更容易上手。 GoLang框架在效能上稍有優勢,Go框架的可擴充性更高。案例:gin-gonic(Go框架)用於建立RESTAPI,而Echo(GoLang框架)用於建立Web應用程式。

最佳實踐:使用明確定義的錯誤類型(errors套件)建立自訂錯誤提供更多詳細資訊適當記錄錯誤正確傳播錯誤,避免隱藏或抑制根據需要包裝錯誤以添加上下文

可以透過使用gjson函式庫或json.Unmarshal函數將JSON資料儲存到MySQL資料庫中。 gjson函式庫提供了方便的方法來解析JSON字段,而json.Unmarshal函數需要一個目標類型指標來解組JSON資料。這兩種方法都需要準備SQL語句和執行插入操作來將資料持久化到資料庫中。

如何在Go框架中解決常見的安全問題隨著Go框架在Web開發中的廣泛採用,確保其安全至關重要。以下是解決常見安全問題的實用指南,附帶範例程式碼:1.SQL注入使用預編譯語句或參數化查詢來防止SQL注入攻擊。例如:constquery="SELECT*FROMusersWHEREusername=?"stmt,err:=db.Prepare(query)iferr!=nil{//Handleerror}err=stmt.QueryR

FindStringSubmatch函數可找出正規表示式匹配的第一個子字串:此函數傳回包含匹配子字串的切片,第一個元素為整個匹配字串,後續元素為各個子字串。程式碼範例:regexp.FindStringSubmatch(text,pattern)傳回符合子字串的切片。實戰案例:可用於匹配電子郵件地址中的域名,例如:email:="user@example.com",pattern:=@([^\s]+)$獲取域名match[1]。
