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
非賦值的用途:
如上所述,所有三種特殊形式僅用于作業。嘗試在其他表達式(函數調用、返回等)中使用多值返回將失敗,因為這些不是賦值并且不會從特殊形式中受益。
- 1 回答
- 0 關注
- 135 瀏覽
添加回答
舉報