Go 語言中的可賦值性(Assignability in Go)

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。Go 是靜態類型的程式設計語言。儲存到變數中的值必須與變數的類型匹配。因此,不能像 Python 這種動態類型語言一樣,隨意的資料都可以作為值賦給變數。這個決定什麼是允許賦值的規則就叫做可賦值性(Assignability)。左邊類型為 T 的變數,存在 6 種可以將右邊的值賦給左邊的情況。## 1. 相同類型(Identical types)第一種是非常明顯的。如果右邊的類型(也)是 T,則賦值是完全可以的。更多的細節可以參考 ["Identical types in Go"](https://medium.com/golangspec/assignability-in-go-27805bcd5874)。## 2. 相同的基礎類型(Identical underlying types)在 Go 語言中,每種類型都有一種基礎類型(underlying type)。對於布爾型,數字,字串或者常量的基礎類型都跟它們本身的類型相同。其他的基礎類型來自於聲明時的類型:```gotype X map[string]intvar x X // underlying type is map[string]int```可賦值的第二種情況是相同的基礎類型:```gotype X map[string]intvar x Xvar y map[string]intx = y```然而,如果有兩個不同的命名類型(named types),則不能這麼做:```gotype X map[string]inttype Y map[string]intvar x Xvar y Yx = y // cannot use y (type Y) as type X in assignment```附加的條件是要求至少一個類型不是一個命名類型。Go 中的變數要麼是命名類型(named)要麼是非命名類型(unnamed)。非命名類型(unnamed types)是指使用類型字面意思(語言本身)定義的類型:```govar a [10]stringvar b struct{ field string}var c map[string]int```## 3. 將一個實現了介面 T 的變數賦值給 T 介面類型的變數如果一個變數實現了介面 T,那麼我們可以將這個變數賦值給一個 T 介面類型的變數。```gotype Callable interface {f() int}type T intfunc (t T) f() int {return int(t)}var c Callablevar t Tc = t```更多關於介面類型的細節都在 [語言規範(language spec)](https://golang.org/ref/spec#Interface_types)。## 4. 將雙向管道(channel)的變數賦值給相同類型的變數(Assigning bidirectional channel to variable with identical element types)```gotype T chan<- map[string]intvar c1 Tvar c2 chan map[string]intc1 = c2c2 = c1 // cannot use c1 (type T) as type chan map[string]int in assignment```跟第二種情況(相同的基礎類型)一樣,要求至少一種管道(channel)變數是非命名類型(unnamed type):```gotype T chan<- map[string]inttype T2 chan map[string]intvar c1 Tvar c2 T2c1 = c2 // cannot use c2 (type T2) as type T in assignment```## 5. 賦值 nil(Assigning nil)允許將 nil 賦值給指標,函數,切片,map,管道,介面類型(的變數)。```govar a *intvar b func(int) intvar c []intvar d map[string]intvar e chan intvar f interface{}a, b, c, d, e, f = nil, nil, nil, nil, nil, nilvar g [10]intg = nil // cannot use nil as type [10]int in assignment```## 6. 無(顯式)指定類型的常量(Untyped constants)關於 Go 常量更深入的介紹請查看[官方部落格](https://blog.golang.org/constants)無(顯式)指定類型的常量可以被賦值給常量所代表的類型 T 相同的類型為 T 的變數。```govar a float32var b float64var c int32var d int64const untyped = 1a = untypedb = untypedc = untypedd = untyped```

via: https://medium.com/golangspec/assignability-in-go-27805bcd5874

作者:Michał Łowicki 譯者:gogeof 校對:polaris1119

本文由 GCTT 原創編譯,Go語言中文網 榮譽推出

本文由 GCTT 原創翻譯,Go語言中文網 首發。也想加入譯者行列,為開源做一些自己的貢獻嗎?歡迎加入 GCTT!
翻譯工作和譯文發表僅用於學習和交流目的,翻譯工作遵照 CC-BY-NC-SA 協議規定,如果我們的工作有侵犯到您的權益,請及時聯絡我們。
歡迎遵照 CC-BY-NC-SA 協議規定 轉載,敬請在本文中標註並保留原文/譯文連結和作者/譯者等資訊。
文章僅代表作者的知識和看法,如有不同觀點,請樓下排隊吐槽

395 次點擊  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.