最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go type關(guān)鍵字(類型定義與類型別名的使用差異)用法實(shí)例探究

 更新時(shí)間:2024年01月18日 09:17:00   作者:wohu 程序員的自我進(jìn)化  
這篇文章主要為大家介紹了Go type關(guān)鍵字(類型定義與類型別名的使用差異)用法實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

1. 類型別名定義

定義類型別名的寫法為:

type TypeAlias = Type

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

2. 類型定義

類型定義語(yǔ)法如下:

type newType Type

其中 newType  是一種新的類型, newType  本身依然具備 Type 類型的特性。

類型聲明語(yǔ)句一般出現(xiàn)在包一級(jí),因此如果新創(chuàng)建的類型名字的首字符大寫,則在包外部也可以使用。

一個(gè)類型聲明語(yǔ)句創(chuàng)建了一個(gè)新的類型名稱,和現(xiàn)有類型具有相同的底層結(jié)構(gòu)。新命名的類型提供了一個(gè)方法,用來(lái)分隔不同概念的類型,這樣即使它們底層類型相同也是不兼容的。

為了說(shuō)明類型聲明,我們將不同溫度單位分別定義為不同的類型:

package main

type Celsius float64    // 攝氏溫度
type Fahrenheit float64 // 華氏溫度
const (
    AbsoluteZeroC Celsius = -273.15 // 絕對(duì)零度
    FreezingC     Celsius = 0       // 結(jié)冰點(diǎn)溫度
    BoilingC      Celsius = 100     // 沸水溫度
)

func CToF(c Celsius) Fahrenheit {
    return Fahrenheit(c*9/5 + 32)
}

func FToC(f Fahrenheit) Celsius {
    return Celsius((f - 32) * 5 / 9)
}

我們?cè)谶@個(gè)包聲明了兩種類型:Celsius 和 Fahrenheit 分別對(duì)應(yīng)不同的溫度單位。它們雖然有著相同的底層類型 float64 ,但是它們是不同的數(shù)據(jù)類型,因此它們不可以被相互比較或混在一個(gè)表達(dá)式運(yùn)算。

刻意區(qū)分類型,可以避免一些像無(wú)意中使用不同單位的溫度混合計(jì)算導(dǎo)致的錯(cuò)誤;因此需要一個(gè)類似 Celsius(t) 或 Fahrenheit(t) 形式的顯式轉(zhuǎn)型操作才能將 float64 轉(zhuǎn)為對(duì)應(yīng)的類型。

只有當(dāng)兩個(gè)類型的底層基礎(chǔ)類型相同時(shí),才允許這種轉(zhuǎn)型操作,或者是兩者都是指向相同底層結(jié)構(gòu)的指針類型,這些轉(zhuǎn)換只改變類型而不會(huì)影響值本身。如果 x 是可以賦值給 T 類型的值,那么 x 必然也可以被轉(zhuǎn)為 T 類型,但是一般沒有這個(gè)必要。

底層數(shù)據(jù)類型決定了內(nèi)部結(jié)構(gòu)和表達(dá)方式,也決定是否可以像底層類型一樣對(duì)內(nèi)置運(yùn)算符的支持。這意味著, Celsius 和 Fahrenheit 類型的算術(shù)運(yùn)算行為和底層的 float64 類型是一樣的,正如我們所期望的那樣。

fmt.Printf("%g\n", BoilingC-FreezingC) // "100" °C</code><code>boilingF := CToF(BoilingC)</code><code>fmt.Printf("%g\n", boilingF-CToF(FreezingC)) // "180" °F
fmt.Printf("%g\n", boilingF-FreezingC)       // compile error: type mismatch

比較運(yùn)算符==<也可以用來(lái)比較一個(gè)命名類型的變量和另一個(gè)有相同類型的變量,或有著相同底層類型的未命名類型的值之間做比較。但是如果兩個(gè)值有著不同的類型,則不能直接進(jìn)行比較:

var c Celsius
var f Fahrenheit
fmt.Println(c == 0)          // "true"
fmt.Println(f &gt;= 0)          // "true"
fmt.Println(c == f)          // compile error: type mismatch
fmt.Println(c == Celsius(f)) // "true"!

注意最后那個(gè)語(yǔ)句。盡管看起來(lái)像函數(shù)調(diào)用,但是 Celsius(f) 是類型轉(zhuǎn)換操作,它并不會(huì)改變值,僅僅是改變值的類型而已。測(cè)試為真的原因是因?yàn)?nbsp;c 和 g 都是零值。

命名類型還可以為該類型的值定義新的行為。這些行為表示為一組關(guān)聯(lián)到該類型的函數(shù)集合,我們稱為類型的方法集。

下面的聲明語(yǔ)句, Celsius 類型的參數(shù) c 出現(xiàn)在了函數(shù)名的前面,表示聲明的是 Celsius 類型的一個(gè)名叫 String 的方法,該方法返回該類型對(duì)象 c 帶著 °C 溫度單位的字符串:

func (c Celsius) String() string { return fmt.Sprintf("%g°C", c) }

許多類型都會(huì)定義一個(gè) String 方法,因?yàn)楫?dāng)使用 fmt 包的打印方法時(shí),將會(huì)優(yōu)先使用該類型對(duì)應(yīng)的 String 方法返回的結(jié)果打印。

c := FToC(212.0)
fmt.Println(c.String()) // "100°C"
fmt.Printf("%v\n", c)   // "100°C"; no need to call String explicitly
fmt.Printf("%s\n", c)   // "100°C"
fmt.Println(c)          // "100°C"
fmt.Printf("%g\n", c)   // "100"; does not call String
fmt.Println(float64(c)) // "100"; does not call String

3. 類型別名與類型定義差異

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

package main
import (
    "fmt"
)
// 將NewInt定義為int類型
// 通過(guò) type 關(guān)鍵字的定義,NewInt 會(huì)形成一種新的類型,NewInt 本身依然具備 int 類型的特性。
type NewInt int
// 將int取一個(gè)別名叫IntAlias, 將 IntAlias 設(shè)置為 int 的一個(gè)別名,使 IntAlias 與 int 等效。
type IntAlias = int
func main() {
    // 將a聲明為NewInt類型
    var a NewInt
    // 查看a的類型名
    fmt.Printf("a type: %T\n", a)   // a type: main.NewInt
    // 將 b 聲明為IntAlias類型
    var b IntAlias
    // 查看b的類型名
    fmt.Printf("b type: %T\n", b)   // b type: int
}

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

4. 非本地類型不能定義方法

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

package main
import (
    "time"
)
// 定義time.Duration的別名為MyDuration
type MyDuration = time.Duration
// 為 MyDuration 添加一個(gè)方法
func (m MyDuration) EasySet(a string) {
}
func main() {
}

錯(cuò)誤信息:

./hello.go:11:6: cannot define new methods on non-local type time.Duration

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

type MyDuration time.Duration

以上就是Go type關(guān)鍵字(類型定義與類型別名的使用差異)用法實(shí)例探究的詳細(xì)內(nèi)容,更多關(guān)于Go type關(guān)鍵字的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳細(xì)介紹Go語(yǔ)言之?dāng)?shù)組與切片

    詳細(xì)介紹Go語(yǔ)言之?dāng)?shù)組與切片

    這篇文章介紹Go語(yǔ)言之?dāng)?shù)組與切片,數(shù)組是具有相同唯一類型的一組已編號(hào)且長(zhǎng)度固定的數(shù)據(jù)項(xiàng)序列,這種類型可是任意的原始類型如整形、字符串或自定義類型。切片是數(shù)組的一個(gè)引用,因此切片是引用類型,在進(jìn)行傳遞時(shí),遵守引用傳遞的機(jī)制,下面我們就來(lái)詳細(xì)了解一下該內(nèi)容
    2021-10-10
  • 深入解析如何基于go-retry構(gòu)建靈活安全和高效的重試邏輯

    深入解析如何基于go-retry構(gòu)建靈活安全和高效的重試邏輯

    本文將深入解析 sethvargo/go-retry 這個(gè)輕量且強(qiáng)大的 Go 重試庫(kù),帶大家從原理到實(shí)踐,構(gòu)建靈活、安全、高效的重試邏輯,感興趣的小伙伴可以了解下
    2025-11-11
  • 后端golang項(xiàng)目一鍵打包部署方案

    后端golang項(xiàng)目一鍵打包部署方案

    本文介紹了如何為Go語(yǔ)言Gin項(xiàng)目添加一鍵打包并自動(dòng)部署功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2026-05-05
  • 使用gin框架搭建簡(jiǎn)易服務(wù)的實(shí)現(xiàn)方法

    使用gin框架搭建簡(jiǎn)易服務(wù)的實(shí)現(xiàn)方法

    go語(yǔ)言web框架挺多的,本文就介紹了一下如何使用gin框架搭建簡(jiǎn)易服務(wù)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 如何使用golang實(shí)現(xiàn)traceroute

    如何使用golang實(shí)現(xiàn)traceroute

    這篇文章主要介紹了如何使用golang實(shí)現(xiàn)traceroute,該工具在linux環(huán)境下的命令是traceroute或者tracepath,在windows下命令是tracert,本文給大家詳細(xì)講解需要的朋友可以參考下
    2023-04-04
  • 一文教你如何用好GO語(yǔ)言變長(zhǎng)參數(shù)

    一文教你如何用好GO語(yǔ)言變長(zhǎng)參數(shù)

    對(duì)于函數(shù)重載相信編碼過(guò)的?xdm?肯定不會(huì)陌生,那么我們一起分別來(lái)看看?C?語(yǔ)言,C++?語(yǔ)言,GO?語(yǔ)言?如何去模擬和使用重載,感興趣的可以學(xué)習(xí)一下
    2023-09-09
  • 解決golang http重定向失效的問(wèn)題

    解決golang http重定向失效的問(wèn)題

    這篇文章主要介紹了解決golang http重定向失效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • golang 使用time包獲取時(shí)間戳與日期格式化操作

    golang 使用time包獲取時(shí)間戳與日期格式化操作

    這篇文章主要介紹了golang 使用time包獲取時(shí)間戳與日期格式化操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • golang的csp模型具體使用

    golang的csp模型具體使用

    本文主要介紹了golang的csp模型具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-12-12
  • GO語(yǔ)言中g(shù)ox交叉編譯的實(shí)現(xiàn)

    GO語(yǔ)言中g(shù)ox交叉編譯的實(shí)現(xiàn)

    本文主要介紹了GO語(yǔ)言中g(shù)ox交叉編譯的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-11-11

最新評(píng)論

兰西县| 如皋市| 海口市| 海阳市| 什邡市| 利辛县| 梨树县| 洛浦县| 大邑县| 齐齐哈尔市| 桐乡市| 砚山县| 武夷山市| 永泰县| 承德县| 麻城市| 张北县| 登封市| 左贡县| 天镇县| 邹城市| 沙河市| 南川市| 永年县| 大化| 修水县| 诏安县| 大埔县| 紫云| 安义县| 林口县| 金堂县| 苍溪县| 民县| 朔州市| 澳门| 余庆县| 南开区| 绥德县| 江安县| 滁州市|