型別轉換在編譯期完成,包括強制轉換和隱式轉換
型別斷言在執行時確定,包括安全型別斷言和非安全型別斷言
go語言要求不同型別之間必須做顯式的型別轉換。但似乎涉及到介面型別時,就會有所不同。
//兩種型別斷言
//不安全的型別斷言,如果系統檢測到不匹配,會在執行時呼叫內建的panic,丟擲異常
s :=
"abc"
i := s.
(int
)//安全的型別斷言。 其中ok為乙個bool值, 表徵型別轉換是否成功; s為返回的int變數,如果失敗返回該型別的零值
i, ok := s.
(int
)
下面是部分例子:
*
point
(p)// same as *(point(p))
(*point)
(p)// p is converted to *point
<-
chan
int(c)
// same as <-(chan int(c))
(<-
chan
int)
(c)// c is converted to <-chan int
func()
(x)// function signature func() x
(func()
)(x)
// x is converted to func()
(func()
int)
(x)// x is converted to func() int
func()
int(x)
// x is converted to func() int (unambiguous)
如果不確定符號的優先順序,可以用括號來約束。
介面之間在編譯期間可以確定的情況下可以使用隱式型別轉換,當然也可以用強制型別轉換(不常用),所有情況下都可以使用型別斷言。
type a inte***ce
type b inte***ce
// 編譯時無法確定能不能轉換,因此用斷言
var a a
var b = a.
(b)// 編譯時,可以確定
var c b
var d =
a(c)
// or var d = c
// or d = c.(a)
普通型別向介面轉換,可以使用隱式型別轉換
type a inte***ce
var s =
"abc"
var a a
a = s
介面向普通型別轉換,只能使用型別斷言,因為編譯器無法確定
type a inte***ce
var s string
var a a
s = a.
(string
)
強制轉換
隱式轉換
型別斷言
型別->型別
可以不可以
可以型別->介面
可以可以
可以介面->型別
不可以不可以
可以介面->介面
(編譯時可確定)可以
(編譯時可確定)可以可以
Go型別斷言
package main import fmt 型別斷言 type assertion 是乙個使用在介面值上的操作,用於檢查介面型別變數所持有的值是否實現了期望的介面或者具體的型別。如何進行型別斷言的判斷?1.使用if語句或者switch語句 2.依靠 value,ok x.t x 表示乙個介面的型...
go語言的型別斷言 Type Assertion
x.t 檢查x的動態型別是否是t,其中x必須是介面值。如果t是具體型別 型別斷言檢查x的動態型別是否等於具體型別t。如果檢查成功,型別斷言返回的結果是x的動態值,其型別是t。換句話說,對介面值x斷言其動態型別是具體型別t,若成功則提取出x的具體值。如果檢查失敗則panic。例如 var w io.w...
go語言型別轉換
string到int int,err strconv.atoi string string到int64 int64,err strconv.parseint string,10,64 第二個引數為基數 2 36 第三個引數位大小表示期望轉換的結果型別,其值可以為0,8,16,32和64,分別對應 i...