欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語(yǔ)言中的自定義類(lèi)型你了解嗎

 更新時(shí)間:2023年04月30日 08:18:04   作者:金刀大菜牙  
自定義類(lèi)型是 Go 語(yǔ)言中非常重要的概念之一,通過(guò)自定義類(lèi)型,我們可以更好地封裝數(shù)據(jù)、組織代碼,提高程序的可讀性和可維護(hù)性。本文將從以下幾個(gè)方面介紹 Go 自定義類(lèi)型的相關(guān)知識(shí),感興趣的可以了解一下

注:本篇文章主要介紹如何在 Go 語(yǔ)言中定義和使用自定義類(lèi)型,涉及到一定的編程基礎(chǔ)知識(shí)和語(yǔ)法。如有不熟悉的地方,建議先去學(xué)習(xí)相關(guān)的基礎(chǔ)知識(shí)。可以閱讀我的另一篇文章:解鎖 Golang 數(shù)據(jù)類(lèi)型:學(xué)會(huì)使用多種類(lèi)型提高代碼可讀性和可維護(hù)性

1. 什么是自定義類(lèi)型

在 Go 語(yǔ)言中,自定義類(lèi)型指的是使用 type 關(guān)鍵字定義的新類(lèi)型,它可以是基本類(lèi)型的別名,也可以是結(jié)構(gòu)體、函數(shù)等組合而成的新類(lèi)型。自定義類(lèi)型可以幫助我們更好地抽象和封裝數(shù)據(jù),讓代碼更加易讀、易懂、易維護(hù)。

比如,我們可以定義一個(gè)自定義類(lèi)型來(lái)表示某個(gè)領(lǐng)域中的概念,比如時(shí)間、日期、貨幣等。這些概念在不同的應(yīng)用場(chǎng)景中有著不同的實(shí)現(xiàn)方式和表示方法,使用自定義類(lèi)型可以使代碼更具可讀性,同時(shí)也便于進(jìn)行后續(xù)的擴(kuò)展和維護(hù)。

2. 如何定義自定義類(lèi)型

在 Go 語(yǔ)言中,使用 type 關(guān)鍵字可以定義一個(gè)新的類(lèi)型,語(yǔ)法如下:

 type NewType OldType

其中,NewType 是新類(lèi)型的名稱(chēng),OldType 可以是任何基本類(lèi)型或現(xiàn)有類(lèi)型的別名,通過(guò)這種方式可以創(chuàng)建一個(gè)新類(lèi)型,使得這個(gè)新類(lèi)型具有與原有類(lèi)型不同的特性。

比如,我們可以使用 type 關(guān)鍵字定義一個(gè)新類(lèi)型來(lái)表示某個(gè)領(lǐng)域中的概念,比如日期:

 type Date string

在這個(gè)例子中,我們使用 type 關(guān)鍵字定義了一個(gè)新類(lèi)型 Date,它是 string 類(lèi)型的別名。這個(gè)新類(lèi)型可以用來(lái)表示日期,例如:

 var today Date = "2023-04-29"

這里定義了一個(gè)變量 today,它的類(lèi)型是 Date,也就是我們剛剛定義的日期類(lèi)型。需要注意的是,雖然 Date 是 string 的別名,但是它與 string 類(lèi)型是不同的類(lèi)型,不能互相賦值或比較。

另外,我們也可以使用 type 關(guān)鍵字來(lái)定義一個(gè)結(jié)構(gòu)體類(lèi)型:

type Person struct {
     Name string
     Age  int
 }

在這個(gè)例子中,我們定義了一個(gè) Person 結(jié)構(gòu)體類(lèi)型,它包含 Name 和 Age 兩個(gè)字段。這個(gè)結(jié)構(gòu)體類(lèi)型可以用來(lái)表示一個(gè)人的基本信息。我們可以使用這個(gè)類(lèi)型來(lái)創(chuàng)建一個(gè) Person 變量:

 var p Person
 p.Name = "Tom"
 p.Age = 18

需要注意的是,在 Go 語(yǔ)言中,自定義類(lèi)型是強(qiáng)類(lèi)型的,也就是說(shuō),不能隨意將一個(gè)類(lèi)型的值賦給另一個(gè)類(lèi)型的變量,需要進(jìn)行類(lèi)型轉(zhuǎn)換才能進(jìn)行賦值。比如,我們不能將一個(gè) int 類(lèi)型的變量賦給一個(gè) string 類(lèi)型的變量,需要使用 strconv 包中的函數(shù)進(jìn)行類(lèi)型轉(zhuǎn)換。

3. 自定義類(lèi)型的方法

除了定義一個(gè)新類(lèi)型外,我們還可以為自定義類(lèi)型定義方法,方法是與類(lèi)型相關(guān)聯(lián)的函數(shù),可以在該類(lèi)型的實(shí)例上調(diào)用。方法使得類(lèi)型具有更加豐富的行為,可以對(duì)該類(lèi)型的數(shù)據(jù)進(jìn)行操作、處理。

在 Go 語(yǔ)言中,使用 func 關(guān)鍵字定義方法,語(yǔ)法如下:

func (receiver Type) methodName(parameters) returnType {
     // 方法體
 }

其中,receiver 表示該方法的接收者,可以是該類(lèi)型的值或指針,Type 表示該方法所屬的類(lèi)型,methodName 表示方法的名稱(chēng),parameters 表示方法的參數(shù),returnType 表示方法的返回值類(lèi)型。

比如,我們可以為上面定義的 Person 結(jié)構(gòu)體類(lèi)型定義一個(gè)方法,來(lái)計(jì)算該人的年齡:

 func (p Person) GetAge() int {
     return p.Age
 }

在這個(gè)例子中,我們定義了一個(gè) GetAge 方法,它的接收者是一個(gè) Person 類(lèi)型的值,返回該人的年齡。我們可以通過(guò)以下方式來(lái)調(diào)用這個(gè)方法:

 var p Person
 p.Age = 18
 age := p.GetAge()

這里首先創(chuàng)建了一個(gè) Person 變量 p,并設(shè)置了其年齡為 18,然后調(diào)用了 p 的 GetAge 方法,返回其年齡,并賦值給 age 變量。

需要注意的是,Go 語(yǔ)言中的方法可以定義在任意類(lèi)型上,而不僅僅是結(jié)構(gòu)體類(lèi)型,比如可以在 int 類(lèi)型上定義方法,可以在自定義類(lèi)型的別名上定義方法等等。

4. 自定義類(lèi)型的嵌入和組合

自定義類(lèi)型的嵌入和組合是 Go 語(yǔ)言中非常重要的概念,可以幫助我們更好地組織和重用代碼。嵌入和組合本質(zhì)上是一種代碼復(fù)用的方式,可以將一個(gè)類(lèi)型的特性復(fù)用到另一個(gè)類(lèi)型中。

在 Go 語(yǔ)言中,使用結(jié)構(gòu)體可以實(shí)現(xiàn)類(lèi)型的嵌入和組合。嵌入表示將一個(gè)類(lèi)型作為結(jié)構(gòu)體的字段嵌入到另一個(gè)類(lèi)型中,使得該類(lèi)型可以使用被嵌入類(lèi)型的特性。組合表示將多個(gè)類(lèi)型組合在一起形成一個(gè)新類(lèi)型,使得該類(lèi)型可以同時(shí)具有多個(gè)類(lèi)型的特性。

比如,我們可以定義一個(gè)新類(lèi)型 Employee,它組合了 Person 和 Company 兩個(gè)類(lèi)型的特性:

 type Person struct {
     Name string
     Age  int
 }
 ?
 type Company struct {
     Name    string
     Address string
 }
 ?
 type Employee struct {
     Person
     Company
     Salary float64
 }

在這個(gè)例子中,我們定義了 Person 和 Company 兩個(gè)結(jié)構(gòu)體類(lèi)型,然后定義了一個(gè)新的 Employee 類(lèi)型,它包含了 Person 和 Company 兩個(gè)類(lèi)型的特性,以及自己的薪水屬性。通過(guò)這種方式,我們可以在 Employee 類(lèi)型中復(fù)用 Person 和 Company 類(lèi)型的特性,并在其基礎(chǔ)上添加新的屬性和方法。

在使用嵌入和組合時(shí),我們可以通過(guò)結(jié)構(gòu)體字面量來(lái)初始化一個(gè)結(jié)構(gòu)體變量,比如:

 var e Employee = Employee{
     Person{Name: "Tom", Age: 30},
     Company{Name: "Google", Address: "Mountain View"},
     100000.0,
 }

在這個(gè)例子中,我們使用了結(jié)構(gòu)體字面量來(lái)初始化了一個(gè) Employee 類(lèi)型的變量 e,其中 Person 和 Company 字段都使用了字面量來(lái)初始化。

可以通過(guò)以下方式來(lái)訪問(wèn) 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

這里我們通過(guò) e 來(lái)訪問(wèn)了它所嵌入的 Person 和 Company 類(lèi)型的屬性和方法,以及自己的薪水屬性。需要注意的是,如果嵌入的類(lèi)型中存在同名字段或方法,則可以通過(guò)類(lèi)型名加字段名或方法名來(lái)訪問(wèn)指定類(lèi)型的字段或方法。

5. 自定義類(lèi)型的值接收者和指針接收者

在定義類(lèi)型的方法時(shí),可以使用值接收者或指針接收者,它們的區(qū)別在于方法接收者的類(lèi)型是該類(lèi)型的值還是指針。

值接收者表示方法的接收者是該類(lèi)型的值,在方法中對(duì)該值進(jìn)行修改不會(huì)影響到原始值。指針接收者表示方法的接收者是該類(lèi)型的指針,在方法中對(duì)該指針指向的值進(jìn)行修改會(huì)影響到原始值。

比如,我們可以為上面定義的 Person 類(lèi)型定義一個(gè)修改年齡的方法:

 func (p Person) SetAge(age int) {
     p.Age = age
 }

在這個(gè)例子中,我們定義了一個(gè) SetAge 方法,它的接收者是一個(gè) Person 類(lèi)型的值,用于修改該人的年齡。但是,由于方法接收者是該類(lèi)型的值,在方法中對(duì)其進(jìn)行修改并不會(huì)影響到原始值,因此該方法并不能實(shí)現(xiàn)修改年齡的功能。

為了解決這個(gè)問(wèn)題,我們可以使用指針接收者來(lái)定義該方法:

 func (p *Person) SetAge(age int) {
     p.Age = age
 }

在這個(gè)例子中,我們使用了指針接收者來(lái)定義 SetAge 方法,它的接收者是一個(gè) Person 類(lèi)型的指針。通過(guò)使用指針接收者,我們可以在方法中修改該指針指向的值,從而實(shí)現(xiàn)修改年齡的功能。

需要注意的是,當(dāng)類(lèi)型的值較大時(shí),使用指針接收者比值接收者更加高效,因?yàn)橹羔樈邮照邆鬟f的是指向該值的指針,而值接收者傳遞的是該值的副本,如果該值較大,則復(fù)制的開(kāi)銷(xiāo)會(huì)比較大。

6. 自定義類(lèi)型的類(lèi)型方法

除了定義實(shí)例方法,我們還可以定義類(lèi)型方法。類(lèi)型方法是屬于類(lèi)型的方法,而不是屬于實(shí)例的方法。在類(lèi)型方法中,可以使用類(lèi)型名作為接收者,而不是實(shí)例的變量名。

比如,我們可以為 Person 類(lèi)型定義一個(gè)類(lèi)型方法,用于創(chuàng)建新的 Person 類(lèi)型的變量:

 func NewPerson(name string, age int) *Person {
     return &Person{name, age}
 }

在這個(gè)例子中,我們定義了一個(gè) NewPerson 方法,它的接收者是 Person 類(lèi)型的指針,用于創(chuàng)建一個(gè)新的 Person 類(lèi)型的變量。在方法中,我們使用了類(lèi)型名 Person 來(lái)創(chuàng)建了一個(gè)新的 Person 類(lèi)型的變量,并返回該變量的指針。

可以通過(guò)以下方式來(lái)調(diào)用 NewPerson 方法:

 p := NewPerson("Tom", 30)
 fmt.Println(p)    // 輸出 "&{Tom 30}"

在這個(gè)例子中,我們調(diào)用了 NewPerson 方法,創(chuàng)建了一個(gè)新的 Person 類(lèi)型的變量 p,并輸出了該變量的指針。

需要注意的是,類(lèi)型方法和實(shí)例方法之間的區(qū)別在于接收者的類(lèi)型不同,類(lèi)型方法的接收者是類(lèi)型本身的指針,而實(shí)例方法的接收者是該類(lèi)型的實(shí)例的指針或值。

7. 總結(jié)

在 Go 中,自定義類(lèi)型是非常常見(jiàn)的操作,通過(guò)自定義類(lèi)型,我們可以更好地組織和管理代碼。在本文中,我們介紹了 Go 中自定義類(lèi)型的基本概念和語(yǔ)法,包括類(lèi)型別名、結(jié)構(gòu)體、嵌入和組合、值接收者和指針接收者、類(lèi)型方法等。

希望通過(guò)本文的介紹,能夠幫助你更加深入地理解和掌握 Go 中自定義類(lèi)型的相關(guān)知識(shí),并能夠在實(shí)際開(kāi)發(fā)中靈活應(yīng)用。

到此這篇關(guān)于Go語(yǔ)言中的自定義類(lèi)型你了解嗎的文章就介紹到這了,更多相關(guān)Go自定義類(lèi)型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go嵌套匿名結(jié)構(gòu)體的初始化詳解

    go嵌套匿名結(jié)構(gòu)體的初始化詳解

    這篇文章主要介紹了go嵌套匿名結(jié)構(gòu)體的初始化詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Go語(yǔ)言range關(guān)鍵字循環(huán)時(shí)的坑

    Go語(yǔ)言range關(guān)鍵字循環(huán)時(shí)的坑

    今天小編就為大家分享一篇關(guān)于Go語(yǔ)言range關(guān)鍵字循環(huán)時(shí)的坑,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • Go Excelize API源碼解讀GetSheetViewOptions與SetPageLayout

    Go Excelize API源碼解讀GetSheetViewOptions與SetPageLayo

    這篇文章主要為大家介紹了Go Excelize API源碼解讀GetSheetViewOptions與SetPageLayout方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • go?generate代碼自動(dòng)生成指南

    go?generate代碼自動(dòng)生成指南

    這篇文章主要介紹了go?generate代碼自動(dòng)生成指南,本文將探討?go?generate?命令的使用方法、原理以及一些實(shí)際應(yīng)用場(chǎng)景,希望讀者能夠更好地理解和運(yùn)用這個(gè)強(qiáng)大的工具
    2024-01-01
  • Gin 框架快速創(chuàng)建靜態(tài)文件下載Web服務(wù)

    Gin 框架快速創(chuàng)建靜態(tài)文件下載Web服務(wù)

    本文主要介紹了Gin 框架快速創(chuàng)建靜態(tài)文件下載Web服務(wù),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 一文初探?Goroutine?與?channel基本用法

    一文初探?Goroutine?與?channel基本用法

    這篇文章主要為大家介紹了一文初探?Goroutine?與?channel基本用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Go語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單留言板的方法

    Go語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單留言板的方法

    這篇文章主要介紹了Go語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單留言板的方法,涉及數(shù)據(jù)庫(kù)、模板頁(yè)面元素等留言板相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • go語(yǔ)言實(shí)現(xiàn)同步操作項(xiàng)目示例

    go語(yǔ)言實(shí)現(xiàn)同步操作項(xiàng)目示例

    本文主要介紹了go語(yǔ)言實(shí)現(xiàn)同步操作項(xiàng)目示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 詳解golang碎片整理之 fmt.Scan

    詳解golang碎片整理之 fmt.Scan

    本文介紹了從golang語(yǔ)言中fmt包從標(biāo)準(zhǔn)輸入獲取數(shù)據(jù)的Scan系列函數(shù)、從io.Reader中獲取數(shù)據(jù)的Fscan系列函數(shù)以及從字符串中獲取數(shù)據(jù)的Sscan系列函數(shù)的用法,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Go語(yǔ)言中的自定義類(lèi)型你了解嗎

    Go語(yǔ)言中的自定義類(lèi)型你了解嗎

    自定義類(lèi)型是 Go 語(yǔ)言中非常重要的概念之一,通過(guò)自定義類(lèi)型,我們可以更好地封裝數(shù)據(jù)、組織代碼,提高程序的可讀性和可維護(hù)性。本文將從以下幾個(gè)方面介紹 Go 自定義類(lèi)型的相關(guān)知識(shí),感興趣的可以了解一下
    2023-04-04

最新評(píng)論