[英]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
確實是一個字符串,這可以用來告訴編譯器變量是某種類型的。 我的理解正確嗎?
類型聲明使用接口值,並從中提取指定顯式類型的值。
因此,是的,您從類型斷言中獲得的值不是接口值,而是顯式類型。 您還可以通過添加無類型的布爾值來測試類型斷言是否成功:
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.