前言
數十年以來, 傳統的面向對象語言總是說方法屬于類, 但 Go 不是這樣做的: 它提供了方法, 但是并沒有提供類和對象。 乍一看, 這種做法似乎有些奇怪, 甚至可以說有點兒瘋狂, 但實際上 Go 的方法比以往其他語言的方法都要靈活。
使用 kelvinToCelsius 、 celsiusToFahrenheit 、 fahrenheitToCelsius 、 celsiusToKelvin 這樣的函數雖然也能夠完成溫度轉換工作, 但是通過聲明相應的方法并把它們放置到屬于自己的地方, 能夠讓溫度轉換代碼變得更加簡潔明了。
我們可以將方法與同一個包中聲明的任何類型相關聯, 但是不能為 int 和 float64 之類的預聲明類型關聯方法。 其中, 聲明類型的方法在前面已經介紹過了:
kelvin 類型跟它的底層類型 float64 具有相同的行為, 我們可以像處理浮點數那樣, 對 kelvin 類型的值執行加法運算、乘法運算以及其他操作。 此外, 聲明一個將 kelvin 轉換為 celsius 的方法就跟聲明一個具有同等作用的函數一樣簡單——它們都以關鍵字 func 開頭, 并且函數體跟方法體完全一樣:
func kelvinToCelsius(k kelvin) celsius { // kelvinToCelsius 函數
return celsius(k - 273.15)
}
func (k kelvin) celsius() celsius { // kelvin 類型的 celsius 方法
return celsius(k - 273.15)
}
如圖 13-1 所示, celsius 方法雖然沒有接受任何形參, 但它的名字前面卻有一個類似形參的接收者。 每個方法和函數都可以接受多個形參, 但一個方法必須并且只能有一個接收者。 在 celsius 方法體中, 接收者的行為就跟其他形參一樣。

圖 13-1 方法聲明
除聲明語法有些許不同之外, 調用方法的語法與調用函數的語法也不一樣:
var k kelvin = 294.0
var c celsius
c = kelvinToCelsius(k) // 調用 kelvinToCelsius 函數
c = k.celsius() // 調用celsius方法
跟調用其他包中的函數一樣, 調用方法也需要用到點記號。 以上面的代碼為例, 在調用方法的時候, 程序首先需要給出正確類型的變量, 接著是一個點號, 最后才是被調用方法的名字。
既然溫度轉換操作現在已經是 kelvin 類型的方法, 那么繼續使用 kelvinToCelsius 這樣的名字就沒有必要了。 在同一個包里面, 如果一個名字已經被函數占用了, 那么這個包就無法再定義同名的類型, 因此在使用函數的情況下, 我們將無法使用 celsius 函數返回 celsius 類型的值。 然而, 如果我們使用的是方法, 那么每種溫度類型都可以具有自己的 celsius 方法, 就像以下展示的 fahrenheit 類型一樣:
type fahrenheit float64
// celsius方法會將華氏度轉換為攝氏度
func (f fahrenheit) celsius() celsius {
return celsius((f - 32.0) * 5.0 / 9.0) }
通過讓每種溫度類型都具有相應的 celsius 方法以轉換為攝氏溫度, 我們可以創造出一種完美的對稱。
總結
到此這篇關于Go語言中如何通過方法為類型添加行為的文章就介紹到這了,更多相關Go語言通過方法為類型添加行為內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- GO語言基本類型分析
- GO語言類型轉換和類型斷言實例分析
- Go語言基礎知識總結(語法、變量、數值類型、表達式、控制結構等)
- GO語言基本數據類型總結
- Go語言的方法接受者類型用值類型還是指針類型?
- Go語言中的復合類型詳細介紹
- 為什么Go語言把類型聲明放在后面?
- Go語言基本的語法和內置數據類型初探