go語言方法之方法聲明

? ? ? ? 從我們的理解來講,一個對象其實也就是一個簡單的賦值或者一個變量,在這個對象中會包含一些方法,而一個方法則是一個一個和特殊類型關聯的函數。一個面向對象的程序會用方法來表達其屬性和對應的操作,這樣使用這個對象的用戶就不需要直接去操作對象,而是借助方法來做這些事情。

? ? ? ? 在函數聲明時,在其名字之前放上一個變量,即是一個方法。這個附加的參數會將該函數附加到這種類型上,即相當于為這種類型定義了一個獨占的方法。

package mainimport ("fmt""math"
)type Point struct{ X, Y float64 }// traditional function
func Distance(p, q Point) float64 {return math.Hypot(q.X-p.X, q.Y-p.Y)
}// same thing, but as a method of the Point type
func (p Point) Distance(q Point) float64 {return math.Hypot(q.X-p.X, q.Y-p.Y)
}func main() {p := Point{1, 2}q := Point{4, 6}fmt.Println(Distance(p, q)) fmt.Println(p.Distance(q))  
}5
5Process finished with the exit code 0

?

? ? ? ? 上面的代碼里面有個附加參數p,叫做方法的接收器(receiver),早期的面向對象語言留下的遺產將調用一個方法稱為“向一個對象發送消息”。

? ? ? ? 在Go語言中,我們并不會像其他語言那樣用this或者self作為接收器,我們可以任意的選擇接收器的名字。由于接收器的名字經常會被使用到,所以保持其在方法間傳遞的一致性和簡短性是不錯的主意。這里的建議是可以使用其類型的第一個字母,比如這里使用了Point的首字母p。

? ? ? ? 在方法調用過程中,接收器參數一般會在方法名之前出現。這種方法聲明是一樣的,都是接收器參數在方法名字之前。

? ? ? ? 上圖中的兩個函數都是調用的distance,但是卻沒有發生沖突。第一個distance的調用實際上用的是包級別的函數main.Distance,而第二個則是使用剛剛聲明的Point,調用的是Point類下聲明的Point.Distance方法。

? ? ? ? 這種p.Distance的表達式叫做選擇器,因為他會選擇合適的對應p這個對象的Distance方法來執行。選擇器也會被用來選擇一個struct類型的字段,比如p.X。由于方法和字段都是在同一命名空間,所以如果我們在這里聲明一個X方法的話,編譯器會報錯,因為在調用p.X時會有歧義。

? ? ? ? 因為每種類型都有其他方法的命名空間,我們在用Distance這個名字的時候,不同的Distance調用指向了不同類型的Distance方法。讓我們來定義一個Path類型,這個Path代表一個線段 的集合,并且也給這個Path定義一個叫Distance的方法。

????????

// A Path is a journey connecting the points with straight lines.
type Path []Point
// Distance returns the distance traveled along the path.
func (path Path) Distance() float64 {sum := 0.0for i := range path {if i > 0 {sum += path[i-1].Distance(path[i])}}return sum
}

? ? ? ? Path是一個命名的slice類型,而不是Point那樣的struct類型,然而我們依然可以為它定義方法。在能夠給任意類型定義方法這一點上,Go和很多其它的面向對象的語言不太一樣。因此 在Go語言里,我們為一些簡單的數值、字符串、slice、map來定義一些附加行為很方便。方法可以被聲明到任意類型,只要不是一個指針或者一個interface。

????????兩個Distance方法有不同的類型。他們兩個方法之間沒有任何關系,盡管Path的Distance方法 會在內部調用Point.Distance方法來計算每個連接鄰接點的線段的長度。 讓我們來調用一個新方法,計算三角形的周長:

perim := Path{{1, 1},{5, 1},{5, 4},{1, 1},
}
fmt.Println(perim.Distance()) // "12"

????????在上面兩個對Distance名字的方法的調用中,編譯器會根據方法的名字以及接收器來決定具體 調用的是哪一個函數。第一個例子中path[i-1]數組中的類型是Point,因此Point.Distance這個 方法被調用;在第二個例子中perim的類型是Path,因此Distance調用的是Path.Distance。 Go語言圣經 方法聲明 211 對于一個給定的類型,其內部的方法都必須有唯一的方法名,但是不同的類型卻可以有同樣 的方法名,比如我們這里Point和Path就都有Distance這個名字的方法;所以我們沒有必要非 在方法名之前加類型名來消除歧義,比如PathDistance。這里我們已經看到了方法比之函數 的一些好處:方法名可以簡短。當我們在包外調用的時候這種好處就會被放大,因為我們可 以使用這個短名字,而可以省略掉包的名字,下面是例子:

import "gopl.io/ch6/geometry"perim := geometry.Path{{1, 1}, {5, 1}, {5, 4}, {1, 1}}
fmt.Println(geometry.Path.Distance(perim)) // "12", standalone function
fmt.Println(perim.Distance()) // "12", method of geometry.Path

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/17512.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/17512.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/17512.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

centos6下面用yum安裝php7.3

首先安裝remi.repo 倉庫 參考: centos yum方式安裝PHP74 centos yum方式安裝PHP74_yum 安裝php74-CSDN博客 yum安裝 yum install php73-php-pecl-zip bz2 curl event gd json openssl mysqlnd PDO yum install php-posix php73 composer.phar config -g repo.packagist co…

AI大模型在測試中的深度應用與實踐案例

文章目錄 1. 示例項目背景2. 環境準備3. 代碼實現3.1. 自動生成測試用例3.2. 自動化測試腳本3.3. 性能測試3.4. 結果分析 4. 進一步深入4.1. 集成CI/CD管道4.1.1 Jenkins示例 4.2. 詳細的負載測試和性能監控4.2.1 Locust示例 4.3. 測試結果分析與報告 5. 進一步集成和優化5.1. …

IND-ID-CPA 和 IND-ANON-ID-CPA Game

Src: https://eprint.iacr.org/2017/967.pdf

算法訓練 | 二叉樹Part5 | 513.找樹左下角的值、112.路徑總和、106.從中序與后序遍歷序列構造二叉樹

目錄 513.找樹左下角的值 遞歸法 迭代法 ? 112.路徑總和 遞歸法 迭代法 106.從中序與后序遍歷序列構造二叉樹 遞歸法 513.找樹左下角的值 題目鏈接:513. 找樹左下角的值 - 力扣(LeetCode) 文章講解:programmercarl.com…

超聲波清洗機哪些品牌好用點?四大極其出色的機型一目了然

各位眼鏡俠們,在佩戴眼鏡的是,有沒有覺得眼鏡總是有些難以言喻的“味道”或者是污漬在鏡片上面。是的,沒有猜錯,那是我們臉上油脂、汗液和各種不明物質的混合體。特別是在夏天的時候天氣太炎熱會經常出汗,眼鏡上會沾染…

2021職稱繼續教育--加快構建完整內需體系,形成國內國際雙循環相互促進新格局

單選題(共7題,每題5分) 1、根據本講,突破和推進“一帶一路”戰略,要滿足以企業為主體、以()為導向的基本要求。 D、市場 2、根據本講,讓農村消費市場持續擴張的前提(&am…

shell將文件分割成小塊文件

背景&#xff1a;某軟件最多支持1G的文件傳輸&#xff0c;需要對大文件進行切割。 方案1&#xff1a; 可以使用split命令將文件均分成10分片。以下是具體的命令示例&#xff1a; split -b $(($(du -b < 文件名) / 10)) 文件名 分片前綴 這里文件名是你想要分割的文件的名…

網絡架構三層到大二層的對比和選擇

在企業的網絡結構選擇中&#xff0c;有二層網絡和三層網絡結構兩種選擇。三層是按照邏輯拓撲結構進行的分類&#xff0c;匯聚層和接入層&#xff0c;流量縱向經過接入層、匯聚層網絡&#xff0c;收斂至骨干核心層。二層網絡結構沒有匯聚層。大二層網絡架構通常使用VLAN&#xf…

上海冠珠旗艦總店盛裝開業暨冠珠瓷磚中國美學設計巡回圓滿舉辦

上海&#xff0c;這座融合了東西方文化的國際化大都市&#xff0c;不僅是中國的時尚中心&#xff0c;也是全球潮流的匯聚地。在這里&#xff0c;古典與現代交織&#xff0c;傳統與前衛并存&#xff0c;為傳統色彩與現代設計的融合提供了得天獨厚的條件。 5月25日&#xff0c;上…

JWT-登錄后下發令牌

后端 寫一個jwt工具類&#xff0c;處理令牌的生成和校驗&#xff0c;如&#xff1a; 響應數據樣例&#xff1a; 前端要做的&#xff1a;

ts 中的 type 和 interface 有什么區別?

一、用法舉例 interface Person {name: stringage: number }const person: Person {name: Kite,age: 24 }type Person {name: stringage: number }const person: Person {name: Kite,age: 24 }二、翻閱 ts 的官方文檔&#xff1a; 1、interface 接口 TypeScript的核心原則…

Weblogic SSRF漏洞 [CVE-2014-4210]

漏洞復現環境搭建請參考 http://t.csdnimg.cn/svKal docker未能成功啟動redis請參考 http://t.csdnimg.cn/5osP3 漏洞原理 Weblogic的uddi組件提供了從其他服務器應用獲取數據的功能并且沒有對目標地址做過濾和限制&#xff0c;造成了SSRF漏洞&#xff0c;利用該漏洞可以向內…

【AJAX前端框架】Asynchronous Javascript And Xml

1 傳統請求及缺點 傳統的請求都有哪些&#xff1f; 直接在瀏覽器地址欄上輸入URL。點擊超鏈接提交form表單使用JS代碼發送請求 window.open(url)document.location.href urlwindow.location.href url… 傳統請求存在的問題 頁面全部刷新導致了用戶的體驗較差。傳統的請求導…

安泰電子:高壓功率放大器應用場合介紹

高壓功率放大器是一種電子設備&#xff0c;用于將低電壓信號放大到較高電壓水平&#xff0c;以滿足各種應用需求。它在多個領域中具有廣泛的應用&#xff0c;包括科學研究、工業生產、通信技術以及醫療設備。下面安泰電子將介紹高壓功率放大器的應用場合。 科學研究 高壓功率放…

【最優化方法】實驗一 熟悉MATLAB基本功能

實驗一  熟悉MATLAB基本功能 實驗的目的和要求&#xff1a;在本次實驗中&#xff0c;通過親臨使用MATLAB&#xff0c;對該軟件做一全面了解并掌握重點內容。 實驗內容&#xff1a; &#xff11;、全面了解MATLAB系統 &#xff12;、實驗常用工具的具體操作和功能 學習建…

在Open AI的Assistant API中,Thread代表什么?

在OpenAI的Assistant API中&#xff0c;Thread通常代表一系列相關的對話&#xff0c;保持對話的上下文和連貫性。這對于創建連續對話非常重要&#xff0c;因為它允許模型記住先前的交互&#xff0c;并在隨后的響應中參考這些信息。 具體作用 保持上下文&#xff1a;Thread可以…

深入學習Python:掌握面向對象編程

在上一篇文章中,我們介紹了Python的基本語法和概念,包括變量、數據類型、條件語句、循環、函數和文件操作。接下來,我們將深入探討Python的面向對象編程(OOP)特性,這是現代編程中的一個重要概念。通過這篇文章,你將學會如何使用類和對象來組織和管理你的代碼。 1. 面向…

哇!數據中臺竟是企業數字化轉型的關鍵力量!

在當今數字化浪潮席卷的時代&#xff0c;數據中臺正成為企業實現數字化轉型的關鍵力量。那么&#xff0c;究竟什么是數據中臺呢&#xff1f;它乃是一種持續讓企業數據活躍起來的機制&#xff0c;能夠將企業內各部分數據匯聚至一個平臺&#xff0c;達成數據的統一化管理。 數據中…

Linux快速定位日志 排查bug技巧和常用命令

1. 快速根據關鍵字定位錯誤信息 grep 在 Linux 系統中&#xff0c;可以使用 grep 命令來查找日志文件中包含特定關鍵字的行。假設你的日志文件路徑為 /var/log/myapp.log&#xff0c;你想要查找包含關鍵字 "abc" 的日志內容&#xff0c;可以按照以下步驟操作&#…