go的Type switch是一個switch語句麼?

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

相信這樣的語句在go中大家見的很多

switch t := arg.(type) {default:    fmt.Printf("unexpected type %T\n", t)     // %T prints whatever type t hascase bool:    fmt.Printf("boolean %t\n", t)             // t has type boolcase int:    fmt.Printf("integer %d\n", t)             // t has type intcase *bool:    fmt.Printf("pointer to boolean %t\n", *t) // t has type *boolcase *int:    fmt.Printf("pointer to integer %d\n", *t) // t has type *int}

不過不知道有人細想過沒有這樣一個問題,

t:=arg.(type) 

在這個switch中 真的不是一個簡簡單單的變數t的聲明以及賦值.

首先, 不能把這句單獨分離出去.

也就是說,這樣寫是不對的.

t:=arg.(type)switch t {  ....  }

這裡的t:=必須和switch結合在一起.

其次這個t到底是什麼類型呢?

按道理說在一個{}範圍中一個變數應該有一個確定的類型. 但是明顯這裡t要根據switch 匹配的值來確定類型的.

第三, 這個switch能用fallthrough麼?

我們知道go語言有fallthrough關鍵字專門來處理類比c語言中的switch的行為(不愧是c語言的設計者設計的).

但是這裡明顯不能用fallthrough

 

關於這個問題我第一次用的時候沒覺得有什麼問題,覺得很自然,直到看別人寫的代碼的時候突然意識到這個t居然如此強大,到底是一個類型呢還是一個變數?

我想應該這麼理解,這裡的type switch不是普通的switch,就是go語言在文法層面為我們設計的類型轉換的一種模式。

不能不感歎go語言的編譯器是有多智能啊!雖然看起來go的關鍵字很少,但是真是細究起來裡面的魔鬼細節還是很多啊!

 

以上只是我自己的一點學習感悟,與大家分享。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.