C語言中文網 目錄
首頁 > Go語言教程 > Go語言接口 閱讀:2,231

Go語言類型分支(switch判斷空接口中變量的類型)

Go 語言的 switch 不僅可以像其他語言一樣實現數值、字符串的判斷,還有一種特殊的用途——判斷一個接口內保存或實現的類型。

類型斷言的書寫格式

switch 實現類型分支時的寫法格式如下:
switch 接口變量.(type) {
    case 類型1:
        // 變量是類型1時的處理
    case 類型2:
        // 變量是類型2時的處理
    …
    default:
        // 變量不是所有case中列舉的類型時的處理
}
對各個部分的說明:
  • 接口變量:表示需要判斷的接口類型的變量。
  • 類型1、類型2……:表示接口變量可能具有的類型列表,滿足時,會指定 case 對應的分支進行處理。

使用類型分支判斷基本類型

下面的例子將一個 interface{} 類型的參數傳給 printType() 函數,通過 switch 判斷 v 的類型,然后打印對應類型的提示,代碼如下:
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 中寫的將是各種類型分支。

代碼經過 switch 時,會判斷 v 這個 interface{} 的具體類型從而進行類型分支跳轉。

switch 的 default 也是可以使用的,功能和其他的 switch 一致。

使用類型分支判斷接口類型

多個接口進行類型斷言時,可以使用類型分支簡化判斷過程。

現在電子支付逐漸成為人們普遍使用的支付方式,電子支付相比現金支付具備很多優點。例如,電子支付能夠刷臉支付,而現金支付容易被偷等。使用類型分支可以方便地判斷一種支付方法具備哪些特性,具體請參考下面的代碼。

電子支付和現金支付:
package main

import "fmt"

// 電子支付方式
type Alipay struct {
}

// 為Alipay添加CanUseFaceID()方法, 表示電子支付方式支持刷臉
func (a *Alipay) CanUseFaceID() {
}

// 現金支付方式
type Cash struct {
}

// 為Cash添加Stolen()方法, 表示現金支付方式會出現偷竊情況
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))

    // 使用現金判斷
    print(new(Cash))
}
代碼說明如下:
  • 第 6~19 行,分別定義 Alipay 和 Cash 結構,并為它們添加具備各自特點的方法。
  • 第 22~29 行,定義兩種特性,即刷臉和被偷。
  • 第 32 行,傳入支付方式的接口。
  • 第 33 行,使用類型分支進行支付方法的特性判斷。
  • 第 34~37 行,分別對刷臉和被偷的特性進行打印。

運行代碼,輸出如下:
*main.Alipay can use faceid
*main.Cash may be stolen

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo