<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在Go
中,型別斷言和型別轉換是一個令人困惑的事情,他們似乎都在做同樣的事情。
下面是一個型別斷言的例子:
var greeting interface{} = "hello world" greetingStr := greeting.(string)
接著看一個型別轉換的例子:
greeting := []byte("hello world") greetingStr := string(greeting)
最明顯的不同點是他們具有不同的語法(variable.(type) vs type(variable) )
。接下來,我們進一步去研究。
顧名思義,型別斷言用於斷言變數是屬於某種型別。型別斷言只能發生在interface{}
型別上。
上面型別斷言的例子,greeting
是一個interface{}
型別,我們為其分配了一個字串。現在,我們可以認為greeting
實際上是一個string
,但是對外展示的是一個interface{}
。
如果我們想獲取greeting
的原始型別,那麼我們可以斷言它是個string
,並且此斷言操作會返回其string
型別。
這意味著在做型別斷言的時候,我們應該知道任何變數的基礎型別。但是情況並非總是這樣的,這就是為什麼型別斷言操作實際上還返回了第二個可選值的原因。
var greeting interface{} = "42" greetingStr, ok := greeting.(string)
第二個值是一個布林值,如果斷言正確,返回 true ,否則返回 false。
另外,型別斷言是在程式執行時執行。
型別判斷是一個很實用的構造。當你不確定interface{}
真正型別的時候,可以使用它。
var greeting interface{} = 42 switch g := greeting.(type) { case string: fmt.Println("g is a string with length", len(g)) case int: fmt.Println("g is an integer, whose value is", g) default: fmt.Println("I don't know what g is") }
在上面的例子中,我們似乎在將greeting
從interface{}
轉換成int
型別或者string
型別。但是greeting
的型別是固定,並且和初始化期間宣告時的內容一樣。
當我們把greeting
分配給interface{}
型別的時候,請勿修改其原始型別。同樣,當我們斷言型別的時候,我們只是使用了原始型別功能,而不是使用interface
公開的有限方法。
首先,我們花點時間瞭解一下什麼是 “型別”。在 Go 每種型別都定義了兩件事:
這裡介紹了基本型別,包括了string
和int
。以及一些複合型別,比如struct``map``array
和slice
。 你可以從基本型別或通過建立複合型別來宣告一個新型別。
// `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()) }
當我們宣告一個myInt
型別,我們可以將變數資料基於基本的int
型別,但是如果要進行變數修改,我們可以通過myInt
型別變數進行操作 (通過在myInt
上面宣告一個新方法)。 由於myInt
的型別基於int
,意味著他們的底層基礎型別是一樣的。因此這些型別的變數可以相互轉換。
var i myInt = 4 originalInt := int(i)
上面i
的型別是myInt
,originalInt
的型別是int
。
只有當基礎資料結構型別相同,型別之間才可以相互轉換。來看一個使用struct
例子。
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)" 會導致編譯錯誤 fmt.Println(bob, babyBob) }
在這裡,person 和 child 擁有相同的資料結構,即:
struct { name string age int }
因此他們可以相互轉換。 type
可用於宣告具有相同資料結構的多種型別。 這只是意味著child
和person
基於相同的資料結構 (類似於之前的int
和myInt
)。
就像上面說的,雖然不同型別的基礎結構可能相同,但是他們可能也具有不同的限制和方法。當我們從一種型別轉換成另一種型別時,會改變對型別的處理方式,而不是像型別斷言那樣僅公開其基礎型別,這就是他們本質的差別。
如果嘗試去轉換錯誤的型別,型別轉換會提示編譯錯誤,這和型別斷言所提供的執行時通過返回值判斷錯誤,完全相反。
型別斷言和型別轉換有著比語法層面上更根本的區別。它還強調了在Go
中介面型別 (interface
) 和非介面型別之間的區別。 介面型別沒有任何資料結構,而是公開了已有的具體型別 (具有底層資料結構) 的一些方法。
型別斷言引出了介面的具體型別,而型別轉換改變了在具有相同資料結構的兩個具體型別之間使用變數的方式。
到此這篇關於一文帶你瞭解Go語言中的型別斷言和型別轉換的文章就介紹到這了,更多相關Go型別斷言 型別轉換內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45