日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
創(chuàng)新互聯(lián)GO教程:Go語(yǔ)言type關(guān)鍵字(類型別名)

注意:本節(jié)內(nèi)容涉及Go語(yǔ)言新版本的功能,內(nèi)容上會(huì)涉及后續(xù)章節(jié)講解的類型定義及結(jié)構(gòu)體嵌入等特性。另外,本節(jié)內(nèi)容適用于對(duì)Go語(yǔ)言很熟悉且正在關(guān)注工程升級(jí)、代碼重構(gòu)等問(wèn)題的讀者閱讀。

專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)上虞免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了近1000家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

類型別名是 Go 1.9 版本添加的新功能,主要用于解決代碼升級(jí)、遷移中存在的類型兼容性問(wèn)題。在 C/ C++ 語(yǔ)言中,代碼重構(gòu)升級(jí)可以使用宏快速定義一段新的代碼,Go語(yǔ)言中沒(méi)有選擇加入宏,而是解決了重構(gòu)中最麻煩的類型名變更問(wèn)題。

在 Go 1.9 版本之前定義內(nèi)建類型的代碼是這樣寫(xiě)的:

type byte uint8
type rune int32

而在 Go 1.9 版本之后變?yōu)椋?/p>

type byte = uint8
type rune = int32

這個(gè)修改就是配合類型別名而進(jìn)行的修改。

區(qū)分類型別名與類型定義

定義類型別名的寫(xiě)法為:

type TypeAlias = Type

類型別名規(guī)定:TypeAlias 只是 Type 的別名,本質(zhì)上 TypeAlias 與 Type 是同一個(gè)類型,就像一個(gè)孩子小時(shí)候有小名、乳名,上學(xué)后用學(xué)名,英語(yǔ)老師又會(huì)給他起英文名,但這些名字都指的是他本人。

類型別名與類型定義表面上看只有一個(gè)等號(hào)的差異,那么它們之間實(shí)際的區(qū)別有哪些呢?下面通過(guò)一段代碼來(lái)理解。

package main

import (
    "fmt"
)

// 將NewInt定義為int類型
type NewInt int

// 將int取一個(gè)別名叫IntAlias
type IntAlias = int

func main() {

    // 將a聲明為NewInt類型
    var a NewInt
    // 查看a的類型名
    fmt.Printf("a type: %T\n", a)

    // 將a2聲明為IntAlias類型
    var a2 IntAlias
    // 查看a2的類型名
    fmt.Printf("a2 type: %T\n", a2)
}

代碼運(yùn)行結(jié)果:

a type: main.NewInt
a2 type: int

代碼說(shuō)明如下:

  • 第 8 行,將 NewInt 定義為 int 類型,這是常見(jiàn)的定義類型的方法,通過(guò) type 關(guān)鍵字的定義,NewInt 會(huì)形成一種新的類型,NewInt 本身依然具備 int 類型的特性。
  • 第 11 行,將 IntAlias 設(shè)置為 int 的一個(gè)別名,使用 IntAlias 與 int 等效。
  • 第 16 行,將 a 聲明為 NewInt 類型,此時(shí)若打印,則 a 的值為 0。
  • 第 18 行,使用%T格式化參數(shù),打印變量 a 本身的類型。
  • 第 21 行,將 a2 聲明為 IntAlias 類型,此時(shí)打印 a2 的值為 0。
  • 第 23 行,打印 a2 變量的類型。

結(jié)果顯示 a 的類型是 main.NewInt,表示 main 包下定義的 NewInt 類型,a2 類型是 int,IntAlias 類型只會(huì)在代碼中存在,編譯完成時(shí),不會(huì)有 IntAlias 類型。

非本地類型不能定義方法

能夠隨意地為各種類型起名字,是否意味著可以在自己包里為這些類型任意添加方法呢?參見(jiàn)下面的代碼演示:

package main

import (
    "time"
)

// 定義time.Duration的別名為MyDuration
type MyDuration = time.Duration

// 為MyDuration添加一個(gè)函數(shù)
func (m MyDuration) EasySet(a string) {

}

func main() {

}

代碼說(shuō)明如下:

  • 第 8 行,為 time.Duration 設(shè)定一個(gè)類型別名叫 MyDuration。
  • 第 11 行,為這個(gè)別名添加一個(gè)方法。

編譯上面代碼報(bào)錯(cuò),信息如下:

cannot define new methods on non-local type time.Duration

編譯器提示:不能在一個(gè)非本地的類型 time.Duration 上定義新方法,非本地類型指的就是 time.Duration 不是在 main 包中定義的,而是在 time 包中定義的,與 main 包不在同一個(gè)包中,因此不能為不在一個(gè)包中的類型定義方法。

解決這個(gè)問(wèn)題有下面兩種方法:

  • 將第 8 行修改為 type MyDuration time.Duration,也就是將 MyDuration 從別名改為類型;
  • 將 MyDuration 的別名定義放在 time 包中。

在結(jié)構(gòu)體成員嵌入時(shí)使用別名

當(dāng)類型別名作為結(jié)構(gòu)體嵌入的成員時(shí)會(huì)發(fā)生什么情況呢?請(qǐng)參考下面的代碼。

package main

import (
    "fmt"
    "reflect"
)

// 定義商標(biāo)結(jié)構(gòu)
type Brand struct {
}

// 為商標(biāo)結(jié)構(gòu)添加Show()方法
func (t Brand) Show() {
}

// 為Brand定義一個(gè)別名FakeBrand
type FakeBrand = Brand

// 定義車輛結(jié)構(gòu)
type Vehicle struct {

    // 嵌入兩個(gè)結(jié)構(gòu)
    FakeBrand
    Brand
}

func main() {

    // 聲明變量a為車輛類型
    var a Vehicle
   
    // 指定調(diào)用FakeBrand的Show
    a.FakeBrand.Show()

    // 取a的類型反射對(duì)象
    ta := reflect.TypeOf(a)

    // 遍歷a的所有成員
    for i := 0; i < ta.NumField(); i++ {

        // a的成員信息
        f := ta.Field(i)

        // 打印成員的字段名和類型
        fmt.Printf("FieldName: %v, FieldType: %v\n", f.Name, f.Type.
            Name())
    }
}

代碼輸出如下:

FieldName: FakeBrand, FieldType: Brand
FieldName: Brand, FieldType: Brand

代碼說(shuō)明如下:

  • 第 9 行,定義商標(biāo)結(jié)構(gòu)。
  • 第 13 行,為商標(biāo)結(jié)構(gòu)添加 Show() 方法。
  • 第 17 行,為 Brand 定義一個(gè)別名 FakeBrand。
  • 第 20~25 行,定義車輛結(jié)構(gòu) Vehicle,嵌入 FakeBrand 和 Brand 結(jié)構(gòu)。
  • 第 30 行,將 Vechicle 實(shí)例化為 a。
  • 第 33 行,顯式調(diào)用 Vehicle 中 FakeBrand 的 Show() 方法。
  • 第 36 行,使用反射取變量 a 的反射類型對(duì)象,以查看其成員類型。
  • 第 39~42 行,遍歷 a 的結(jié)構(gòu)體成員。
  • 第 45 行,打印 Vehicle 類型所有成員的信息。

這個(gè)例子中,F(xiàn)akeBrand 是 Brand 的一個(gè)別名,在 Vehicle 中嵌入 FakeBrand 和 Brand 并不意味著嵌入兩個(gè) Brand,F(xiàn)akeBrand 的類型會(huì)以名字的方式保留在 Vehicle 的成員中。

如果嘗試將第 33 行改為:

a.Show()

編譯器將發(fā)生報(bào)錯(cuò):

ambiguous selector a.Show

在調(diào)用 Show() 方法時(shí),因?yàn)閮蓚€(gè)類型都有 Show() 方法,會(huì)發(fā)生歧義,證明 FakeBrand 的本質(zhì)確實(shí)是 Brand 類型。


分享標(biāo)題:創(chuàng)新互聯(lián)GO教程:Go語(yǔ)言type關(guān)鍵字(類型別名)
網(wǎng)站地址:http://www.5511xx.com/article/cdgcpss.html