新聞中心
type-switch 流程控制的語法或許是Go語言中最古怪的語法。 它可以被看作是類型斷言的增強版。它和 switch-case 流程控制代碼塊有些相似。 一個 type-switch 流程控制代碼塊的語法如下所示:

成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),溧水企業(yè)網(wǎng)站建設(shè),溧水品牌網(wǎng)站建設(shè),網(wǎng)站定制,溧水網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,溧水網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
switch t := areaIntf.(type) {
case *Square:
fmt.Printf("Type Square %T with value %v\n", t, t)
case *Circle:
fmt.Printf("Type Circle %T with value %v\n", t, t)
case nil:
fmt.Printf("nil value: nothing to check?\n")
default:
fmt.Printf("Unexpected type %T\n", t)
} 輸出結(jié)構(gòu)如下:
Type Square *main.Square with value &{5}
變量 t 得到了 areaIntf 的值和類型, 所有 case 語句中列舉的類型(nil 除外)都必須實現(xiàn)對應(yīng)的接口,如果被檢測類型沒有在 case 語句列舉的類型中,就會執(zhí)行 default 語句。
如果跟隨在某個 case 關(guān)鍵字后的條目為一個非接口類型(用一個類型名或類型字面表示),則此非接口類型必須實現(xiàn)了斷言值 x 的(接口)類型。
類型斷言的書寫格式
switch 實現(xiàn)類型分支時的寫法格式如下:
switch 接口變量.(type) {
case 類型1:
// 變量是類型1時的處理
case 類型2:
// 變量是類型2時的處理
…
default:
// 變量不是所有case中列舉的類型時的處理
}對各個部分的說明:
- 接口變量:表示需要判斷的接口類型的變量。
- 類型1、類型2……:表示接口變量可能具有的類型列表,滿足時,會指定 case 對應(yīng)的分支進行處理。
使用類型分支判斷基本類型
下面的例子將一個 interface{} 類型的參數(shù)傳給 printType() 函數(shù),通過 switch 判斷 v 的類型,然后打印對應(yīng)類型的提示,代碼如下:
package main
import (
"fmt"
)
func printType(v interface{}) {
switch v.(type) {
case int:
fmt.Println(v, "is int")
case string:
fmt.Println(v, "is string")
case bool:
fmt.Println(v, "is bool")
}
}
func main() {
printType(1024)
printType("pig")
printType(true)
}代碼輸出如下:
1024 is int
pig is string
true is bool
代碼第 9 行中,v.(type) 就是類型分支的典型寫法。通過這個寫法,在 switch 的每個 case 中寫的將是各種類型分支。
代碼經(jīng)過 switch 時,會判斷 v 這個 interface{} 的具體類型從而進行類型分支跳轉(zhuǎn)。
switch 的 default 也是可以使用的,功能和其他的 switch 一致。
使用類型分支判斷接口類型
多個接口進行類型斷言時,可以使用類型分支簡化判斷過程。
現(xiàn)在電子支付逐漸成為人們普遍使用的支付方式,電子支付相比現(xiàn)金支付具備很多優(yōu)點。例如,電子支付能夠刷臉支付,而現(xiàn)金支付容易被偷等。使用類型分支可以方便地判斷一種支付方法具備哪些特性,具體請參考下面的代碼。
電子支付和現(xiàn)金支付:
package main
import "fmt"
// 電子支付方式
type Alipay struct {
}
// 為Alipay添加CanUseFaceID()方法, 表示電子支付方式支持刷臉
func (a *Alipay) CanUseFaceID() {
}
// 現(xiàn)金支付方式
type Cash struct {
}
// 為Cash添加Stolen()方法, 表示現(xiàn)金支付方式會出現(xiàn)偷竊情況
func (a *Cash) Stolen() {
}
// 具備刷臉特性的接口
type CantainCanUseFaceID interface {
CanUseFaceID()
}
// 具備被偷特性的接口
type ContainStolen interface {
Stolen()
}
// 打印支付方式具備的特點
func print(payMethod interface{}) {
switch payMethod.(type) {
case CantainCanUseFaceID: // 可以刷臉
fmt.Printf("%T can use faceid\n", payMethod)
case ContainStolen: // 可能被偷
fmt.Printf("%T may be stolen\n", payMethod)
}
}
func main() {
// 使用電子支付判斷
print(new(Alipay))
// 使用現(xiàn)金判斷
print(new(Cash))
}代碼說明如下:
- 第 6~19 行,分別定義 Alipay 和 Cash 結(jié)構(gòu),并為它們添加具備各自特點的方法。
- 第 22~29 行,定義兩種特性,即刷臉和被偷。
- 第 32 行,傳入支付方式的接口。
- 第 33 行,使用類型分支進行支付方法的特性判斷。
- 第 34~37 行,分別對刷臉和被偷的特性進行打印。
運行代碼,輸出如下:
*main.Alipay can use faceid
*main.Cash may be stolen
網(wǎng)頁標題:創(chuàng)新互聯(lián)GO教程:Go語言類型分支(switch判斷空接口中變量的類型)
分享鏈接:http://fisionsoft.com.cn/article/cdidogs.html


咨詢
建站咨詢
