【go語言基礎】go中的方法

先思考一個問題,什么是方法,什么是函數?

方法是從屬于某個結構體或者非結構體的。在func這個關鍵字和方法名中間加了一個特殊的接收器類型,這個接收器可以是結構體類型的或者是非結構體類型的。從屬的結構體獲取該方法。

函數則沒有這種從屬關系。

func (t Type) methodName(parameter list) {
}
type Teacher struct {name     stringsalary   intcurrency string
}// 在結構體類型上,創建一個方法并調用。
func (tea Teacher) testSalary() {fmt.Printf("Salary of %s is %d %s", tea.name, tea.salary, tea.currency)
}func testUpFun() {tea:= Teacher{name:     "malou",salary:   10666,currency: "元",}tea.testSalary()
}
相同的名字的方法可以定義在不同的類型上,而相同名字的函數是不允許的
// Rectangle 定義Rectangle結構體
type Rectangle struct {length intwidth  int
}// Circle 定義Circle 結構體
type Circle struct {radius float64
}func (rectangle Rectangle) Area() int {return rectangle.width * rectangle.length
}func (circle Circle) Area() float64 {return math.Pi * circle.radius * circle.radius
}func testArea() {r := Rectangle{width:  10,length: 20,}fmt.Printf("Area is %d\n", r.Area())c := Circle{radius: 12,}fmt.Printf("Area is %f\n", c.Area())
}
值接收器和指針接收器之間的區別在于,在指針接收器的方法內部的改變對于調用者是可見的,然而值接收器的情況不是這樣的。
// Dog struct
type Dog struct {name stringage  int
}// 使用值接收器的方法
func (d Dog) changeDogName(newName string) {d.name = newName
}// 使用指針接收器的方法
func (d *Dog) changeAge(newAge int) {d.age = newAge
}func testPointerStruct() {d := Dog{name: "金mao",age:  22,}// 并沒有改變實際的值,只是改變的變量的副本fmt.Printf("before change is %s\n", d.name)d.changeDogName("馬犬")fmt.Printf("after change is %s\n", d.name)// 改變的是變量本身的值fmt.Printf("before change is %d\n", d.age)d.changeAge(11)fmt.Printf("after change is %d\n", d.age)
}
那什么時候使用指針接收器,什么時候使用值接收器?指針接收器可以使用在:對方法內部的接收器所做的改變應該對調用者可見時。當拷貝一個結構體的代價過于昂貴的時候,比如說結構體中有很多字段,如果方法內使用這個結構體做為值接收器需要拷貝整個結構體,這個代價十分昂貴,這種情況下使用指針接收器,結構體不會被拷貝,只會傳遞一個指針到方法的內部。在其他的所有情況,值接收器都可以被使用。在方法中使用值接收器 和 在函數中使用值參數:
type rectangle struct {width  intlength int
}
// 函數中的參數,值類型,只能傳遞一個值類型
func area(r rectangle) {fmt.Printf("Area Function result :%d\n", r.length*r.width)
}func (r rectangle) area() {fmt.Printf("Area Method result :%d\n", r.length*r.width)
}func testFunAndMethod() {r := rectangle{width:  10,length: 15,}area(r)r.area()p := &r// (*p).area(),go解釋器會自動的解引用p.area()
}// 在方法中使用指針,和在函數中使用指針參數
func (r *rectangle) perimeter() {fmt.Printf("Area Method result is %d\n", r.width*r.length)
}func perimeter(r *rectangle) {fmt.Printf("Area Function result is %d\n", r.width*r.length)
}func testPointerStruct1() {r := rectangle{width:  12,length: 10,}p := &rperimeter(p)p.perimeter()// r.perimeter() 解釋為 (&r).perimeter()  還有一種是(*p).name  相互解引用,從指針p->(*p),從值r到指針(&r)r.perimeter()
}

小結:

大多數方法都使用的是結構體從屬,注意傳遞的是值傳遞還是指針傳遞。

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

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

相關文章

【100天精通python】Day37:GUI界面編程_PyQT從入門到實戰(上)

目錄 專欄導讀 1 PyQt6 簡介: 1.1 安裝 PyQt6 和相關工具: 1.2 PyQt6 基礎知識: 1.2.1 Qt 的基本概念和組件: 1.2.2 創建和使用 Qt 窗口、標簽、按鈕等基本組件 1.2.3 布局管理器:垂直布局、水平布局、網格布局…

typedef函數代碼段解釋以及部分Windows下的系統函數

文章目錄 1、typedef int (WINAPI* LPSDOLInitialize)(const SDOLAppInfo* pAppInfo)2、typedef int (WINAPI* LPSDOLGetModule)(REFIID riid, void** intf)3、typedef int (WINAPI* LPSDOLTerminal)();4、GetProcAddress運行時獲取一個動態鏈接庫(DLL)中…

mysql與redis區別

mysql和redis的數據庫類型 mysql是關系型數據庫,主要用于存放持久化數據,將數據存儲在硬盤中,讀取速度較慢。 redis是NOSQL,即非關系型數據庫,也是緩存數據庫,即將數據存儲在緩存中,緩存的讀取速…

網絡

mcq Java 傳輸層:拆分和組裝,完成端到端的消息傳遞,流量控制,差錯控制等 網絡層: 尋址、路由,復用,擁塞控制,完成源到宿的傳遞。 顯然A選項是錯誤的,有流量控制的是傳輸層…

JavaScript TypeScript

文章目錄 JavaScript語法事件處理與HTML和CSS集成前端框架和庫 TypeScript靜態類型檢查語法更好的可維護性 包管理工具npmpnpmyarnBower JavaScript JavaScript(簡稱JS)是一種廣泛應用于網頁開發的腳本語言。它被用來為網頁增加交互性和動態功能。以下是…

netty學習分享(一)

TCP與UDP TCP 是面向連接的、可靠的流協議,通過三次握手建立連接,通訊完成時要拆除連接。 UDP是面向無連接的通訊協議,UDP通訊時不需要接收方確認,屬于不可靠的傳輸,可能會出現丟包現象 端口號: 端口號用…

【微信小程序】記一次自定義微信小程序組件的思路

最近來個需求,要求給小程序的 modal 增加個關閉按鈕,上網一查發現原來 2018 年就有人給出解決方案了,于是總結下微信小程序自定義組件的思路:一句話,用 wxml css實現和原生組件類似的樣式和效果,之后用 JS…

【uniapp】uniapp設置安全區域:

文章目錄 一、效果圖:二、實現代碼: 一、效果圖: 二、實現代碼: {"path": "pages/index/index","style": {"navigationStyle": "custom","navigationBarTextStyle": "white","navigationBarTitle…

消息隊列學習筆記

消息隊列基礎 適合消息隊列解決的問題 異步處理:處理完關鍵步驟后直接返回結果,后續放入隊列慢慢處理流量控制: 使用消息隊列隔離網關和后端服務,以達到流量控制和保護后端服務的目的。能根據下游的處理能力自動調節流量&#x…

leetcode做題筆記79單詞搜索

給定一個 m x n 二維字符網格 board 和一個字符串單詞 word 。如果 word 存在于網格中,返回 true ;否則,返回 false 。 單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中“相鄰”單元格是那些水平相鄰或垂直相…

Matlab工具NIFTI包的基本功能函數

Matlab工具NIFTI包的基本功能函數 Nifti 格式最初是為神經影像學發明的。神經影像信息學技術計劃(NIFTI)將 NIfTI 格式預設為 ANALYZE7.5 格式的替代品。它最初的應用領域是神經影像,但是也被用在其他領域。這種格式的主要特點就是它包含兩個…

Docker基礎入門:常規軟件安裝與鏡像加載原理

Docker基礎入門:常規軟件安裝與鏡像加載原理 一、Docker常規軟件安裝1.1、部署nginx1.2、部署tomcat1.3、部署elasticsearch1.4、如何部署kibana-->連接elasticsearch1.5、部署可視化工具 二、 鏡像加載原理2.1、鏡像是什么2.2、Docker鏡像加速原理2.3、分層理解…

為什么我的集群一個 Spark Executor / Yarn Container 只分配一個vCore?

在很多集群里,在關閉了Spark的DynamicAllocation的前提下(避免自動申請空閑資源,干擾測試結果),都會觀察到:提交Spark作業時,申請 1 個 driver + n 個 executor 會在Yarn上對應創建 n+1 個 container,但是每個container只有一個vCore,通過--driver-cores和--executor-…

Grafana Prometheus 通過JMX監控kafka 【2023最新方式】

第三方kafka exporter方案 目前網上關于使用Prometheus 監控kafka的大部分資料都是使用一個第三方的 kafka exporter,他的原理大概就是啟動一個kafka客戶端,獲取kafka服務器的信息,然后提供一些metric接口供Prometheus使用,隨意它…

docker 安裝mysql8.0

1、拉取鏡像 docker pull mysql2、運行鏡像 docker run -d --restartalways --name mysql --privilegedtrue -p 3306:3306 -v /home/sunyuhua/docker/mysql/data:/var/lib/mysql -v /home/sunyuhua/docker/mysql/conf:/etc/mysql/conf.d -v /home/sunyuhua/docker/mysql/logs…

07_Hudi案例實戰、Flink CDC 實時數據采集、Presto、FineBI 報表可視化等

7.第七章 Hudi案例實戰 7.1 案例架構 7.2 業務數據 7.2.1 客戶信息表 7.2.2 客戶意向表 7.2.3 客戶線索表 7.2.4 線索申訴表 7.2.5 客戶訪問咨詢記錄表 7.3 Flink CDC 實時數據采集 7.3.1 開啟MySQL binlog 7.3.2 環境準備 7.3.3 實時采集數據 7.3.3.1 客戶信息表 7.3.3.2 客戶…

ubuntu安裝jdk、emqx、nginx

一、安裝jdk 要在Ubuntu上安裝JDK 1.8,您可以按照以下步驟進行操作: 打開終端(CtrlAltT)。確保您的系統已更新: sudo apt update sudo apt upgrade安裝OpenJDK 8: sudo apt install openjdk-8-jdk安裝完成…

.net core發布到IIS上出現 HTTP 錯誤 500.19

1.檢查.net core 環境運行環境是否安裝完成,類似如下環境 2.IIS是否安裝全 本次原因就是IIS未安裝全導致的 按照網上說的手動重啟iis(iisreset)也不行

基于C#的消息處理的應用程序 - 開源研究系列文章

今天講講基于C#里的基于消息處理的應用程序的一個例子。 我們知道,Windows操作系統的程序是基于消息處理的。也就是說,程序接收到消息代碼定義,然后根據消息代碼定義去處理對應的操作。前面有一個博文例子( C#程序的啟動顯示方案(無窗口進程發…

【數據結構】 ArrayList簡介與實戰

文章目錄 什么是ArrayListArrayList相關說明 ArrayList使用ArrayList的構造無參構造指定順序表初始容量利用其他 Collection 構建 ArrayListArrayList常見操作獲取list有效元素個數獲取和設置index位置上的元素在list的index位置插入指定元素刪除指定元素刪除list中index位置上…