簡體   English   中英

。(data_type)方法到底調用/做什么?

[英]What exactly does .(data_type) method called/do?

我遇到了使用.(string)方法的一段代碼。 不知道這叫什么,我很難找到它。

這是我嘗試了解的內容:

package main

import "fmt"
import "reflect"

func main(){
    var b interface{}
    b = "silly"

    fmt.Println(reflect.TypeOf(b.(string))) // we know that b 
                                            // is a string                     
                                            // at compile time

    fmt.Println(reflect.TypeOf(b))          // we do not

}

結果:

string
string

但是,我認為reflect.TypeOf會在運行時發生,而.(string)會告訴編譯器b確實是一個字符串,這可以用來告訴編譯器變量是某種類型的。 我的理解正確嗎?

游樂場

b.(string)稱為類型斷言 有效圍棋中所述

類型聲明使用接口值,並從中提取指定顯式類型的值。

因此,是的,您從類型斷言中獲得的值不是接口值,而是顯式類型。 您還可以通過添加無類型的布爾值來測試類型斷言是否成功:

s, ok := b.(string) // s is of type string
if !ok {
    // b did not contain a value of type string!
}

編輯:

為了進一步說明以消除任何可能的誤解:

類型斷言不會像您建議的那樣“告訴Go b是字符串” 它的作用是在運行時嘗試從b提取一個字符串,如果b包含其他類型(除非分配可選的bool值),則會出現恐慌。

從斷言中獲得的值確實將為string類型,從而允許您執行諸如切片(您無法切片接口值)或檢查其len

先前的答案是正確的。 但是我認為這更像是在實踐中發生的事情。 在開關的情況下,。(type)語法通常與類型名稱一起使用。 在此示例中,I(整數expr),B(bool expr)和Bop(二進制op)是類型名稱。

func commute (e Expr) (r Expr, d bool) {
    switch exp:= e.(type) {
        case I: r,d = exp,false
        case B: r,d = exp,false
        case Bop: r,d = Bop{exp.op, exp.right, exp.left},true
        default: r,d = e,false
    }
    return
}

這不是像C強制轉換那樣不安全的方法,因為在case語句中可以確保您具有匹配的類型。 在閱讀通道時,我會看到很多,其中通道的類型是所有情況都實現的接口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM