Go 語言的 Type Switch 語句解析

2021-08-15 08:19:30 字數 2001 閱讀 2955

講述了go語言中 type swith 的用法以及獲取對應變數的一些特殊情況。

type switch 是 go 語言中一種特殊的 switch 語句,它比較的是型別而不是具體的值。它判斷某個介面變數的型別,然後根據具體型別再做相應處理。注意,在 type switch 語句的 case 子句中不能使用fallthrough

它的用法如下。

switch x.(type)
其中,x必須是乙個介面型別的變數,而所有的case語句後面跟的型別必須實現了x的介面型別。

為了便於理解,我們可以結合下面這個例子來看:

package main

import (

"fmt"

"reflect"

)type animal inte***ce

type dog struct {}

func (self dog) shout() string

type cat struct {}

func (self cat) shout() string

func main()

switch animal.(type)

}

在上面的例子中,catdog型別都實現了介面animal,所以它們可以跟在case語句後面,判斷介面變數animal是否是對應的型別。

如果我們不僅想要判斷某個介面變數的型別,還想要獲得其型別轉換後的值的話,我們可以在 switch 的語句表示式中宣告乙個變數來獲得這個值。

其用法如下所示:

package main

import (

"fmt"

"reflect"

)type animal inte***ce

type dog struct

func (self dog) shout() string

type cat struct

func (self cat) shout() string

type tiger struct

func (self tiger) shout() string

func main()

// var animal animal // 驗證 case nil

// var animal animal = wolf{} // 驗證 default

var animal animal = dog{}

switch a := animal.(type)

// fmt.println(a.name) 這裡會報錯,因為 animal 型別沒有成員name

case tiger: // a的型別是 tiger

fmt.println(a.shout(), a.name) // 這裡可以直接取出 name 成員

default: // a的型別是 animal

fmt.println("default", reflect.typeof(a), a)

}}

在上述**中,我們可以看到a := animal.(type)語句隱式地為每個case子句宣告了乙個變數a

變數a型別的判定規則如下:

為了更好地理解上述規則,我們可以用if語句和型別斷言來重寫這個switch語句,如下所示:

v := animal   // animal 只會被求值一次

if v == nil else

if a, istiger := v.(tiger); istiger else else

}

Go語言之GO 語言常量

相對於變數,常量是恆定不變的值,多用於定義程式執行期間不會改變的那些值。常量的宣告和變數宣告非常類似,只是把var換成了const,常量在定義的時候必須賦值。const pi 3.1415 const e 2.7182宣告了pi和e這兩個常量之後,在整個程式執行期間它們的值都不能再發生變化了。多個常...

Go 初學Go語言

馬上要去實習了,要開始實戰了 今天在這總結一些基礎用法,方便後面自己查閱 總結的參考資料為go by example,一邊複習一邊記錄 go by example var a string initial var b,c int 1 2 一次宣告多個 var d true 自動推斷型別 var e ...

五 go語言特性 go語言筆記

defer 呼叫乙個被 defer 的函式時在函式剛要返回之前延遲執行,當函式無論怎樣返回,某資源必須釋放時,可用這種與眾不同 但有效的處理方式。傳統的例子包括解鎖互斥或關閉檔案。package main import log func main mydefer func mydefer func ...