Go語言中的自定義類型你了解嗎
注:本篇文章主要介紹如何在 Go 語言中定義和使用自定義類型,涉及到一定的編程基礎知識和語法。如有不熟悉的地方,建議先去學習相關的基礎知識。可以閱讀我的另一篇文章:解鎖 Golang 數據類型:學會使用多種類型提高代碼可讀性和可維護性
1. 什么是自定義類型
在 Go 語言中,自定義類型指的是使用 type 關鍵字定義的新類型,它可以是基本類型的別名,也可以是結構體、函數等組合而成的新類型。自定義類型可以幫助我們更好地抽象和封裝數據,讓代碼更加易讀、易懂、易維護。
比如,我們可以定義一個自定義類型來表示某個領域中的概念,比如時間、日期、貨幣等。這些概念在不同的應用場景中有著不同的實現方式和表示方法,使用自定義類型可以使代碼更具可讀性,同時也便于進行后續(xù)的擴展和維護。
2. 如何定義自定義類型
在 Go 語言中,使用 type 關鍵字可以定義一個新的類型,語法如下:
type NewType OldType
其中,NewType 是新類型的名稱,OldType 可以是任何基本類型或現有類型的別名,通過這種方式可以創(chuàng)建一個新類型,使得這個新類型具有與原有類型不同的特性。
比如,我們可以使用 type 關鍵字定義一個新類型來表示某個領域中的概念,比如日期:
type Date string
在這個例子中,我們使用 type 關鍵字定義了一個新類型 Date,它是 string 類型的別名。這個新類型可以用來表示日期,例如:
var today Date = "2023-04-29"
這里定義了一個變量 today,它的類型是 Date,也就是我們剛剛定義的日期類型。需要注意的是,雖然 Date 是 string 的別名,但是它與 string 類型是不同的類型,不能互相賦值或比較。
另外,我們也可以使用 type 關鍵字來定義一個結構體類型:
type Person struct { Name string Age int }
在這個例子中,我們定義了一個 Person 結構體類型,它包含 Name 和 Age 兩個字段。這個結構體類型可以用來表示一個人的基本信息。我們可以使用這個類型來創(chuàng)建一個 Person 變量:
var p Person p.Name = "Tom" p.Age = 18
需要注意的是,在 Go 語言中,自定義類型是強類型的,也就是說,不能隨意將一個類型的值賦給另一個類型的變量,需要進行類型轉換才能進行賦值。比如,我們不能將一個 int 類型的變量賦給一個 string 類型的變量,需要使用 strconv 包中的函數進行類型轉換。
3. 自定義類型的方法
除了定義一個新類型外,我們還可以為自定義類型定義方法,方法是與類型相關聯的函數,可以在該類型的實例上調用。方法使得類型具有更加豐富的行為,可以對該類型的數據進行操作、處理。
在 Go 語言中,使用 func 關鍵字定義方法,語法如下:
func (receiver Type) methodName(parameters) returnType { // 方法體 }
其中,receiver 表示該方法的接收者,可以是該類型的值或指針,Type 表示該方法所屬的類型,methodName 表示方法的名稱,parameters 表示方法的參數,returnType 表示方法的返回值類型。
比如,我們可以為上面定義的 Person 結構體類型定義一個方法,來計算該人的年齡:
func (p Person) GetAge() int { return p.Age }
在這個例子中,我們定義了一個 GetAge 方法,它的接收者是一個 Person 類型的值,返回該人的年齡。我們可以通過以下方式來調用這個方法:
var p Person p.Age = 18 age := p.GetAge()
這里首先創(chuàng)建了一個 Person 變量 p,并設置了其年齡為 18,然后調用了 p 的 GetAge 方法,返回其年齡,并賦值給 age 變量。
需要注意的是,Go 語言中的方法可以定義在任意類型上,而不僅僅是結構體類型,比如可以在 int 類型上定義方法,可以在自定義類型的別名上定義方法等等。
4. 自定義類型的嵌入和組合
自定義類型的嵌入和組合是 Go 語言中非常重要的概念,可以幫助我們更好地組織和重用代碼。嵌入和組合本質上是一種代碼復用的方式,可以將一個類型的特性復用到另一個類型中。
在 Go 語言中,使用結構體可以實現類型的嵌入和組合。嵌入表示將一個類型作為結構體的字段嵌入到另一個類型中,使得該類型可以使用被嵌入類型的特性。組合表示將多個類型組合在一起形成一個新類型,使得該類型可以同時具有多個類型的特性。
比如,我們可以定義一個新類型 Employee,它組合了 Person 和 Company 兩個類型的特性:
type Person struct { Name string Age int } ? type Company struct { Name string Address string } ? type Employee struct { Person Company Salary float64 }
在這個例子中,我們定義了 Person 和 Company 兩個結構體類型,然后定義了一個新的 Employee 類型,它包含了 Person 和 Company 兩個類型的特性,以及自己的薪水屬性。通過這種方式,我們可以在 Employee 類型中復用 Person 和 Company 類型的特性,并在其基礎上添加新的屬性和方法。
在使用嵌入和組合時,我們可以通過結構體字面量來初始化一個結構體變量,比如:
var e Employee = Employee{ Person{Name: "Tom", Age: 30}, Company{Name: "Google", Address: "Mountain View"}, 100000.0, }
在這個例子中,我們使用了結構體字面量來初始化了一個 Employee 類型的變量 e,其中 Person 和 Company 字段都使用了字面量來初始化。
可以通過以下方式來訪問 e 的屬性和方法:
fmt.Println(e.Name) // 輸出 "Tom" fmt.Println(e.Age) // 輸出 30 fmt.Println(e.Address) // 輸出 "Mountain View" fmt.Println(e.Salary) // 輸出 100000.0 fmt.Println(e.GetAge()) // 輸出 30
這里我們通過 e 來訪問了它所嵌入的 Person 和 Company 類型的屬性和方法,以及自己的薪水屬性。需要注意的是,如果嵌入的類型中存在同名字段或方法,則可以通過類型名加字段名或方法名來訪問指定類型的字段或方法。
5. 自定義類型的值接收者和指針接收者
在定義類型的方法時,可以使用值接收者或指針接收者,它們的區(qū)別在于方法接收者的類型是該類型的值還是指針。
值接收者表示方法的接收者是該類型的值,在方法中對該值進行修改不會影響到原始值。指針接收者表示方法的接收者是該類型的指針,在方法中對該指針指向的值進行修改會影響到原始值。
比如,我們可以為上面定義的 Person 類型定義一個修改年齡的方法:
func (p Person) SetAge(age int) { p.Age = age }
在這個例子中,我們定義了一個 SetAge 方法,它的接收者是一個 Person 類型的值,用于修改該人的年齡。但是,由于方法接收者是該類型的值,在方法中對其進行修改并不會影響到原始值,因此該方法并不能實現修改年齡的功能。
為了解決這個問題,我們可以使用指針接收者來定義該方法:
func (p *Person) SetAge(age int) { p.Age = age }
在這個例子中,我們使用了指針接收者來定義 SetAge 方法,它的接收者是一個 Person 類型的指針。通過使用指針接收者,我們可以在方法中修改該指針指向的值,從而實現修改年齡的功能。
需要注意的是,當類型的值較大時,使用指針接收者比值接收者更加高效,因為指針接收者傳遞的是指向該值的指針,而值接收者傳遞的是該值的副本,如果該值較大,則復制的開銷會比較大。
6. 自定義類型的類型方法
除了定義實例方法,我們還可以定義類型方法。類型方法是屬于類型的方法,而不是屬于實例的方法。在類型方法中,可以使用類型名作為接收者,而不是實例的變量名。
比如,我們可以為 Person 類型定義一個類型方法,用于創(chuàng)建新的 Person 類型的變量:
func NewPerson(name string, age int) *Person { return &Person{name, age} }
在這個例子中,我們定義了一個 NewPerson 方法,它的接收者是 Person 類型的指針,用于創(chuàng)建一個新的 Person 類型的變量。在方法中,我們使用了類型名 Person 來創(chuàng)建了一個新的 Person 類型的變量,并返回該變量的指針。
可以通過以下方式來調用 NewPerson 方法:
p := NewPerson("Tom", 30) fmt.Println(p) // 輸出 "&{Tom 30}"
在這個例子中,我們調用了 NewPerson 方法,創(chuàng)建了一個新的 Person 類型的變量 p,并輸出了該變量的指針。
需要注意的是,類型方法和實例方法之間的區(qū)別在于接收者的類型不同,類型方法的接收者是類型本身的指針,而實例方法的接收者是該類型的實例的指針或值。
7. 總結
在 Go 中,自定義類型是非常常見的操作,通過自定義類型,我們可以更好地組織和管理代碼。在本文中,我們介紹了 Go 中自定義類型的基本概念和語法,包括類型別名、結構體、嵌入和組合、值接收者和指針接收者、類型方法等。
希望通過本文的介紹,能夠幫助你更加深入地理解和掌握 Go 中自定義類型的相關知識,并能夠在實際開發(fā)中靈活應用。
到此這篇關于Go語言中的自定義類型你了解嗎的文章就介紹到這了,更多相關Go自定義類型內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Go Excelize API源碼解讀GetSheetViewOptions與SetPageLayo
這篇文章主要為大家介紹了Go Excelize API源碼解讀GetSheetViewOptions與SetPageLayout方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08Gin 框架快速創(chuàng)建靜態(tài)文件下載Web服務
本文主要介紹了Gin 框架快速創(chuàng)建靜態(tài)文件下載Web服務,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12