驚!這道題正確率竟然只有 22%:答案詳解
閱讀本文大概需要 3 分鐘。
大家好,我是 polarisxu。
《Go 語(yǔ)言愛(ài)好者周刊》第 148 期有一道題目:以下代碼輸出什么?
package main
import (
"fmt"
)
func main() {
m := [...]int{
'a': 1,
'b': 2,
'c': 3,
}
m['a'] = 3
fmt.Println(len(m))
}
A:3;B:4;C:100;D:編譯失敗
大家的答題情況如下:

正確率只有 22%(正確答案是 C)。不知道你選對(duì)了嗎?
核心知識(shí)點(diǎn)
這道題目的核心點(diǎn)在于對(duì) rune 字面量的理解和數(shù)組的語(yǔ)法。
在 Go 語(yǔ)言規(guī)范中有這么一句話:
A rune literal represents a rune constant[1], an integer value identifying a Unicode code point. A rune literal is expressed as one or more characters enclosed in single quotes, as in
'x'or'\n'.
即一個(gè) rune 字面量代表一個(gè) rune 常量。而常量分為有類(lèi)型常量(typed)和無(wú)類(lèi)型常量(untyped)。而字面量屬于無(wú)類(lèi)型常量,只不過(guò)每一個(gè)無(wú)類(lèi)型常量都有一個(gè)默認(rèn)類(lèi)型。比如 a 字面量是一個(gè)無(wú)類(lèi)型常量,它的默認(rèn)類(lèi)型是 rune。關(guān)于常量的這個(gè)知識(shí)點(diǎn),之前周刊題解有過(guò)詳細(xì)介紹:常量表達(dá)式這個(gè)規(guī)則應(yīng)該了解下[2]。
當(dāng)在上下文中需要一個(gè)無(wú)類(lèi)型常量帶類(lèi)型的值時(shí),會(huì)進(jìn)行隱式轉(zhuǎn)換(或使用默認(rèn)類(lèi)型)。本題中,a、b、c 是 rune 字面量(rune 是 int32 的別名),但被當(dāng)做了 int 數(shù)組的下標(biāo)或索引([...]int 這是數(shù)組的一種語(yǔ)法,數(shù)組長(zhǎng)度編譯時(shí)推斷出來(lái)的)。語(yǔ)言規(guī)范中關(guān)于索引表達(dá)式有這么一句話:
a constant index that is untyped is given type
int
以下示例有助于你理解這個(gè)這道題:
// 這樣正常
const r = 'a'
var a int = r
// 這樣不能編譯
const r rune = 'a'
var a int = r
而我們知曉 c 的 ASCII 碼是 99,這道題相當(dāng)于這樣:
package main
import (
"fmt"
)
func main() {
m := [...]int{
97: 1,
98: 2,
99: 3,
}
m[97] = 3
fmt.Println(len(m))
}
很顯然長(zhǎng)度是 100。
不要在乎題目是不是變態(tài),而是希望能夠通過(guò)題目掌握一兩個(gè)知識(shí)點(diǎn)。
參考資料
rune constant: https://docs.studygolang.com/ref/spec#Constants
[2]常量表達(dá)式這個(gè)規(guī)則應(yīng)該了解下: https://polarisxu.studygolang.com/posts/go/action/weekly-question-94/
我是 polarisxu,北大碩士畢業(yè),曾在 360 等知名互聯(lián)網(wǎng)公司工作,10多年技術(shù)研發(fā)與架構(gòu)經(jīng)驗(yàn)!2012 年接觸 Go 語(yǔ)言并創(chuàng)建了 Go 語(yǔ)言中文網(wǎng)!著有《Go語(yǔ)言編程之旅》、開(kāi)源圖書(shū)《Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)》等。
堅(jiān)持輸出技術(shù)(包括 Go、Rust 等技術(shù))、職場(chǎng)心得和創(chuàng)業(yè)感悟!歡迎關(guān)注「polarisxu」一起成長(zhǎng)!也歡迎加我微信好友交流:gopherstudio
