在 這篇文章,我們將看到類型斷言和類型轉(zhuǎn)換實(shí)際上是如何截然不同的,并深入了解在 首先,讓我們看看它們長什么樣…… 下面是一個類型斷言的例子: var greeting interface{} = 'hello world' greetingStr := greeting.(string) 接著看一個類型轉(zhuǎn)換的例子:
最明顯的不同點(diǎn)是他們具有不同的語法 類型斷言顧名思義,類型斷言用于斷言變量是屬于某種類型。類型斷言只能發(fā)生在 這意味著在做類型斷言的時候,我們應(yīng)該知道任何變量的基礎(chǔ)類型。但是情況并非總是這樣的,這就是為什么類型斷言操作實(shí)際上還返回了第二個可選值的原因。 var greeting interface{} = '42' greetingStr, ok := greeting.(string) 第二個值是一個布爾值,如果斷言正確,返回 true ,否則返回 false。 類型判斷類型判斷是一個很實(shí)用的構(gòu)造。當(dāng)你不確定
為什么需要斷言在上面的例子中,我們似乎在將 類型轉(zhuǎn)換首先,我們花點(diǎn)時間了解一下什么是 “類型”。在 Go 每種類型都定義了兩件事:
這里介紹了基本類型,包括了 你可以從基本類型或通過創(chuàng)建復(fù)合類型來聲明一個新類型。 // `myInt` 是一個新類型,它的基類型是 `int` type myInt int
// AddOne 方法適用于 `myInt` 類型,不適用于 `int` 類型 func (i myInt) AddOne() myInt { return i + 1}
func main() { var i myInt = 4 fmt.Println(i.AddOne()) }
當(dāng)我們聲明一個 由于
上面 什么時候使用類型轉(zhuǎn)換?只有當(dāng)基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)類型相同,類型之間才可以相互轉(zhuǎn)換。來看一個使用 type person struct { name string age int }
type child struct { name string age int }
type pet { name string }
func main() { bob := person{ name: 'bob', age: 15, } babyBob := child(bob) // 'babyBob := pet(bob)' 會導(dǎo)致編譯錯誤 fmt.Println(bob, babyBob) }
在這里,person 和 child 擁有相同的數(shù)據(jù)結(jié)構(gòu),即:
因此他們可以相互轉(zhuǎn)換。
type pet person 這只是意味著 類型為什么稱為轉(zhuǎn)換就像上面說的,雖然不同類型的基礎(chǔ)結(jié)構(gòu)可能相同,但是他們可能也具有不同的限制和方法。當(dāng)我們從一種類型轉(zhuǎn)換成另一種類型時,會改變對類型的處理方式,而不是像類型斷言那樣僅公開其基礎(chǔ)類型,這就是他們本質(zhì)的差別。(ps:這句話是我自己加的)。 類型結(jié)論類型斷言和類型轉(zhuǎn)換有著比語法層面上更根本的區(qū)別。它還強(qiáng)調(diào)了在 接口類型沒有任何數(shù)據(jù)結(jié)構(gòu),而是公開了已有的具體類型 (具有底層數(shù)據(jù)結(jié)構(gòu)) 的一些方法。 |
|