亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go 中的哪些語義規則決定何時發生單值賦值與何時發生二值賦值?

Go 中的哪些語義規則決定何時發生單值賦值與何時發生二值賦值?

Go
長風秋雁 2022-06-27 10:12:05
map在學習A Tour of Go: Mutating Maps時,我發現令人驚訝的一件事是,我們可以使用單值賦值或雙值賦值來訪問映射中鍵的值。示例代碼:package mainimport (    "fmt")func main() {    m := map[int]int{2: 4, 3: 9, 4: 16}        // Example 1    fmt.Println(m[2])        // Example 2    v := m[2]    fmt.Println(v)        // Example 3    v, ok := m[2]    fmt.Println(v, ok)}輸出:444 true使用相同語法同時支持單值和雙值賦值涉及哪些語義規則?Go 中是否還有其他這種特殊形式,根據賦值運算符的左側,以相同的語法同時支持單值和雙值賦值?此外,我可以自己編寫一個函數foo(),根據賦值運算符的左側返回一個值或兩個值嗎?
查看完整描述

1 回答

?
米琪卡哇伊

TA貢獻1998條經驗 獲得超6個贊

映射索引操作的一兩個值分配是一種特殊形式,為方便起見,不幸的是,它不能在“正?!狈峙渲型瓿伞?/p>


普通賦值表達式:

該規范對元組分配有以下說法:


元組賦值將多值運算的各個元素分配給變量列表。有兩種形式。首先,右手操作數是單個多值表達式,例如函數調用、通道或映射操作或類型斷言。左側操作數的數量必須與值的數量相匹配。例如,如果 f 是一個返回兩個值的函數,


x, y = f()


將第一個值分配給 x,將第二個值分配給 y。第二種形式,左邊的操作數的個數必須等于右邊的表達式的個數,每個表達式都必須是單值的,右邊的第n個表達式賦值給左邊的第n個操作數:


one, two, three = '一', '二', '三'


這不會為分配中值的數量留下任何歧義的余地。


一值或二值表達式:

有 4 種情況,表達式左側同時允許一個值和兩個值。其中三個是賦值表達式的特殊形式,最后一個是range子句。


索引表達式:


索引表達式被定義為 的形式a[x],地圖除外:


在特殊形式的賦值或初始化中使用的 map [K]V 類型的映射 a 上的索引表達式


v, ok = a[x]

v, ok := a[x]

var v, ok = a[x]

產生一個額外的無類型布爾值。


接收運營商:


接收操作符也會發生同樣的情況,通常格式為x <-ch:


在特殊形式的賦值或初始化中使用的接收表達式


x, ok = <-ch

x, ok := <-ch

var x, ok = <-ch

var x, ok T = <-ch

產生一個額外的無類型布爾結果,報告通信是否成功。


類型斷言:


再一次提到類型斷言中的特殊形式,通常是這樣的形式:x.(T)


在特殊形式的賦值或初始化中使用的類型斷言


v, ok = x.(T)

v, ok := x.(T)

var v, ok = x.(T)

var v, ok T1 = x.(T)

產生一個額外的無類型布爾值。


范圍子句:


帶有 range 子句的for 語句具有與之相關的更寬松的語言,因為它不是對正常賦值表達式的修改:


左側的函數調用在每次迭代時評估一次。對于每次迭代,如果存在相應的迭代變量,則按如下方式生成迭代值:


Range expression                          1st value          2nd value


array or slice  a  [n]E, *[n]E, or []E    index    i  int    a[i]       E

string          s  string type            index    i  int    see below  rune

map             m  map[K]V                key      k  K      m[k]       V

channel         c  chan E, <-chan E       element  e  E

非賦值的用途:

如上所述,所有三種特殊形式僅用于作業。嘗試在其他表達式(函數調用、返回等)中使用多值返回將失敗,因為這些不是賦值并且不會從特殊形式中受益。


查看完整回答
反對 回復 2022-06-27
  • 1 回答
  • 0 關注
  • 135 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號