1. 程式人生 > >Golang從入門到精通(十一):Golang方法

Golang從入門到精通(十一):Golang方法

方法

在 Go 語言中有一個概念和函式極其相似,叫做方法 。Go 語言的方法其實是作用在接收者(receiver)上的一個函式,接收者是某種非內建型別的變數。因此方法是一種特殊型別的函式。

接收者型別可以是(幾乎)任何型別,不僅僅是結構體型別:任何型別都可以有方法,甚至可以是函式型別,可以是 int、bool、string 或陣列的別名型別。但是接收者不能是一個介面型別。

方法的宣告和普通函式的宣告類似,只是在函式名稱前面多了一個引數,這個引數把這個方法繫結到這個引數對應的型別上。

和函式關係

方法是特殊的函式,定義在某一特定的型別上,通過型別的例項來進行呼叫,這個例項被叫接收者(receiver)。
函式將變數作為引數:Function1(recv)


方法在變數上被呼叫:recv.Method1()
接收者必須有一個顯式的名字,這個名字必須在方法中被使用。
receiver_type 叫做 (接收者)基本型別,這個型別必須在和方法同樣的包中被宣告。

在 Go 中,(接收者)型別關聯的方法不寫在型別結構裡面,就像類那樣;耦合更加寬鬆;型別和方法之間的關聯由接收者來建立。
方法沒有和資料定義(結構體)混在一起:它們是正交的型別;表示(資料)和行為(方法)是獨立的。

注意: Go語言不允許為簡單的內建型別新增方法,所以下面定義的方法是非法的。

package main

import(
  "fmt"
)


func Add(a ,b int
){ //函式合法 fmt.Println(a+b) } func (a int) Add (b int){ //方法非法!不能是內建資料型別 fmt.Println(a+b) }

這個時候我們需要用Go語言的type,來臨時定義一個和int具有同樣功能的型別。這個型別不能看成是int型別的別名,它們屬於不同的型別,不能直接相互賦值。

修改後合法的方法定義如下:

package main

import(
  "fmt"
)

type myInt int

func Add(a ,b int){             //函式
  fmt.Println(a+b)
}

func
(a myInt) Add (b myInt){ //方法 fmt.Println(a+b) } func main() { a, b := 3,4 var aa,bb myInt = 3,4 Add(a,b) aa.Add(bb) }

上面的表示式aa.Add稱作選擇子(selector),它為接收者aa選擇合適的Add方法。

“類的”方法

Go 語言不像其它面相物件語言一樣可以寫個類,然後在類裡面寫一堆方法,但其實Go語言的方法很巧妙的實現了這種效果:我們只需要在普通函式前面加個接受者(receiver,寫在函式名前面的括號裡面),這樣編譯器就知道這個函式(方法)屬於哪個struct了。例如:

type A struct {
    Name string
}

func (a A)foo()  { //接收者寫在函式名前面的括號裡面
    fmt.Println("foo")
}

func main() {
    a := A{}
    a.foo() //foo
}

相關推薦

Golang入門精通Golang方法

方法 在 Go 語言中有一個概念和函式極其相似,叫做方法 。Go 語言的方法其實是作用在接收者(receiver)上的一個函式,接收者是某種非內建型別的變數。因此方法是一種特殊型別的函式。 接收者型別可以是(幾乎)任何型別,不僅僅是結構體型別:任何型別都可以

Golang入門精通Golang併發程式設計之Goroutine

程序,執行緒,並行和併發 一個應用程式是執行在機器上的一個程序;程序是一個執行在自己記憶體地址空間裡的獨立執行體。一個程序由一個或多個作業系統執行緒組成,這些執行緒其實是共享同一個記憶體地址空間的一起工作的執行體。幾乎所有’正式’的程式都是多執行緒的,以便讓使

Golang入門精通Golang併發程式設計之Channel

Go語言併發模型 Go 語言中使用了CSP模型來進行執行緒通訊,準確說,是輕量級執行緒goroutine之間的通訊。CSP模型和Actor模型類似,也是由獨立的,併發執行的實體所構成,實體之間也是通過傳送訊息進行通訊的。 Actor模型和CSP模型區別 A

機器學習之python入門指南numpy常用方法簡介

  numpy庫的安裝: window下命令列直接輸入pip install numpy 匯入numpy庫:import numpy 或者 import numpy as np numpy與list: 相同之處: 都可以用下標訪問元素,如a[3]. 都可以

tkinter 庫入門教程放置位置

放置方式1.place() 放置方式2.grid() 放置方式3.place() 原始碼: # 建立主視窗 import tkinter as tk window = tk.Tk() window.title('放置位置') window.geometry

Openstack入門之neutron服務控制節點的部署與測試

驅動 username 禁止 普通 虛擬主機 group 查看 禁用 poi 1.Neutron的介紹   Neutron 為整個 OpenStack 環境提供網絡支持,包括二層交換,三層路由,負載均衡,防火墻和 *** 等。Neutron 提供了一個靈

ElasticSearch最佳入門實踐分散式原理 橫向擴容過程,如何超出擴容極限,以及如何提升容錯性

(1)primary&replica自動負載均衡,6個shard,3 primary,3 replica (2)每個node有更少的shard,IO/CPU/Memory資源給每個shard分配更多,每個shard效能更好 (3)擴容的極限,6個shard(3 prima

【PP生產訂單】入門介紹

一、重大確認 重大確認:比如有10、20、30三個工序,30設定成了重大確認,當你做30報工的時候系統會自動對10和20也做報工。 設定方法:工序設定裡面的”控制碼“。 然後我們使用事務程式碼CO11直接對工序0030做確認,可以發現”重大事件“這裡是預設勾選的。

Python入門File檔案方法

Python File(檔案) 方法 file 物件使用 open 函式來建立,下表列出了 file 物件常用的函式: 序號 方法 描述 1 file.close() 關

Spring Boot 初級入門教程 —— 打分離 jar 包、部署和測試附原始碼

分離 jar 包,也就是把工程原始碼打包到 *.jar,而把工程依賴的所有 lib 單獨生成,這樣打包的好處是,在依賴包沒有修改的情況下,部署時只需要上傳一次依賴包,每次部署的專案 jar 包很小,在伺服器網路不太好的情況下,這樣做是非常有必要的,因為上傳 20M 和 上傳 20K 的時間還是有

Android入門筆記

十一、資料繫結 與 MVVM 11.1 MVC 之前我們所使用的都是 MVC 架構,即組成為: M - model 模型層:主要用來作為資料的 ORM 對映,將資料轉化為物件的形式來進行處理; V - view 檢視層:主要的作用是用於頁面的檢視顯示,比如於 la

Java程式設計入門筆記

海納百川——物件陣列和集合 物件陣列 陣列 在Java提供的儲存及隨機訪問物件序列的各種方法中,陣列是效率最高的一種 型別檢查 邊界檢查 優點 陣列知道其元素的型別 編譯時的型別檢查 大小已知 代價 陣列物件的大小是固定的,在生存期內大小不可變 物件

java入門學習邏輯運算子和位運算子

家裡有急事 暫停了幾天,抱歉,現在呢開始說說java的運算語句和運算子 如果想利用java的運算語句 那麼就離不開java的運算子,前面第九章講了java的算術運算子,那麼現在咱們說說java的邏輯運算子。特別強調一下 我在這裡說的是邏輯運算子而不是位運算子,至於什麼是位運算子 我後面章節在說。 jav

SpringBoot入門系列篇實現檔案上傳

前情提要 現在大多數的web開發基本都會用到檔案上傳這一個功能,檔案上傳分為單檔案上傳和多檔案上傳,下面就一一講解一下通過SpringBoot框架對兩種上傳的實現 SpringBoot實現單檔案上傳 首先建立一個html介面,包含一個for

零寫一個編譯器程式碼生成之Java位元組碼基礎

專案的完整程式碼在 C2j-Compiler 前言 第十一篇,終於要進入程式碼生成部分了,但是但是在此之前,因為我們要做的是C語言到位元組碼的編譯,所以自然要了解一些位元組碼,但是由於C語言比較簡單,所以只需要瞭解一些位元組碼基礎 JVM的基本機制 JVM有一個執行環境叫做stack frame 這個

Spring Boot 入門整合 WebSocket, 實時顯示系統日誌

以前面的部落格為基礎,最近一篇為Spring Boot 入門(十):整合Redis哨兵模式,實現Mybatis二級快取。本篇部落格主要介紹了Spring Boot整合 Web Socket進行日誌的推送,並實時顯示在頁面上。 1.匯入jar包 第一個jar包是websocket的,第二個jar包是關於環形佇列

0開發3D引擎使用領域驅動設計,最小3D程式中提煉引擎第二部分

[TOC] 大家好,本文根據領域驅動設計的成果,開始實現從最小的3D程式中提煉引擎。 # 上一篇博文 [從0開發3D引擎(十):使用領域驅動設計,從最小3D程式中提煉引擎(第一部分)](https://www.cnblogs.com/chaogex/p/12408831.html) # 本文流程 我

SpringBoot入門系列統一異常處理的實現

前面介紹了Spring Boot 如何整合定時任務已經Spring Boot 如何建立非同步任務和定時任務。不清楚的朋友可以看看之前的文章:《Spring Boot 入門系列文章》 接下來主要講解如何在SpringBoot應用中使用統一異常處理。   為什麼要統一異常處理 專案開發形式為前後端分離,

EF學習筆記實施繼承

long cannot oid data- turn cati com list pac 學習總目錄:ASP.NET MVC5 及 EF6 學習筆記 - (目錄整理) 上篇鏈接:EF學習筆記(十) 處理並發 本篇原文鏈接:Implementing Inheritance 面

DockerDocker實戰部署HTTPS的Tomcat站點

pos 容器 image avi tor 基礎 oot stat ask 1、選擇基礎鏡像    docker pull tomcat:7.0-jre8 2、生成HTTPS證書   keytool -genkey -alias tomcat -keyalg RSA -key