1. 程式人生 > 程式設計 >Go語言中如何通過方法為型別新增行為

Go語言中如何通過方法為型別新增行為

前言

數十年以來, 傳統的面嚮物件語言總是說方法屬於類, 但 Go 不是這樣做的: 它提供了方法, 但是並沒有提供類和物件。 乍一看, 這種做法似乎有些奇怪, 甚至可以說有點兒瘋狂, 但實際上 Go 的方法比以往其他語言的方法都要靈活。

使用 kelvinToCelsius 、 celsiusToFahrenheit 、 fahrenheitToCelsius 、 celsiusToKelvin 這樣的函式雖然也能夠完成溫度轉換工作, 但是通過宣告相應的方法並把它們放置到屬於自己的地方, 能夠讓溫度轉換程式碼變得更加簡潔明瞭。

我們可以將方法與同一個包中宣告的任何型別相關聯, 但是不能為 int 和 float64 之類的預宣告型別關聯方法。 其中, 宣告型別的方法在前面已經介紹過了:

type kelvin 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 方法體中, 接收者的行為就跟其他形參一樣。

Go語言中如何通過方法為型別新增行為
圖 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語言通過方法為型別新增行為內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!