Go語(yǔ)言 關(guān)于《Go語(yǔ)言101》

2023-02-16 17:35 更新

我覺(jué)得很難用通常的描述方式來(lái)描述本文中的內(nèi)容。 所以本文將采用采訪的形式來(lái)進(jìn)行描述。

你好,老貘,你是什么時(shí)候開始寫這本書的?

大概在2016年七月份左右,不是很密集地使用了Go兩年后,我覺(jué)得Go是一門簡(jiǎn)單的語(yǔ)言,我感覺(jué)我已經(jīng)精通了Go編程。 在那個(gè)時(shí)候,我在日常編程中已經(jīng)搜集了不少關(guān)于Go編程的細(xì)節(jié)。 我覺(jué)得我可以將這些細(xì)節(jié)寫成一本書。 我覺(jué)得這應(yīng)該是一件容易的事。

但是我發(fā)現(xiàn)我錯(cuò)了。我太過(guò)于自信了。 在試圖解釋一些細(xì)節(jié)時(shí),我發(fā)現(xiàn)我無(wú)法把它們解釋清楚。 我對(duì)Go編程中的很多細(xì)節(jié)的底層原因產(chǎn)生了困惑。 隨著越來(lái)越多的困惑的積攢,我覺(jué)得我對(duì)Go的領(lǐng)悟非常有限。 我感覺(jué)我仍然是一個(gè)Go新手程序員。

我放棄了寫那本書。

放棄?《Go語(yǔ)言101》現(xiàn)在不是已經(jīng)完成了嗎?

那本曾經(jīng)計(jì)劃要寫的書不是《Go語(yǔ)言101》。 放棄那本書的寫作計(jì)劃后,我通過(guò)閱讀很多官方Go文檔和網(wǎng)絡(luò)中的各種Go文章、關(guān)注Go官方項(xiàng)目的問(wèn)題跟蹤列表和一些Go論壇、查看一些代碼等途徑, 逐漸地,我?guī)缀跸宋宜嘘P(guān)于Go編程細(xì)節(jié)中的困惑。

我大概花了大約一年時(shí)間來(lái)消除這些困惑。 在這個(gè)時(shí)期,每當(dāng)我消除了某個(gè)主題的困惑,我就以該主題寫一篇博客文章。 最后,我寫了大約20篇Go文章。 與此同時(shí),我收集到了比以前更多的Go編程中的細(xì)節(jié)。 此時(shí)到了重啟編寫一本新的Go編程書籍的時(shí)候了。

我寫了另外大約十篇Go基礎(chǔ)教程和另外大約二十篇Go語(yǔ)言中關(guān)于各種其它主題的文章。 所以現(xiàn)在《Go語(yǔ)言101》大約有50篇文章。

你曾經(jīng)的困惑主要包括哪些方面?

一些困惑是關(guān)于一些Go語(yǔ)法和語(yǔ)義設(shè)計(jì)細(xì)節(jié)的。 一些困惑涉及到某些類型的值,主要是切片,接口和通道類型。 另外一些涉及到標(biāo)準(zhǔn)包API的使用細(xì)節(jié)。

你認(rèn)為造成你曾經(jīng)的困惑的主要原因是什么?

我覺(jué)得最主要的原因是我當(dāng)時(shí)抱著Go是一門非常簡(jiǎn)單的語(yǔ)言的態(tài)度去學(xué)習(xí)和使用Go。 持有這種態(tài)度阻止了我更深刻地理解Go。

Go是一門特性豐富的語(yǔ)言。它的語(yǔ)法集雖然不大,但我們也不能說(shuō)它很小。 Go中的一些語(yǔ)法和語(yǔ)義設(shè)計(jì)很簡(jiǎn)單明了,但也有一些設(shè)計(jì)略微反直覺(jué),甚至自相矛盾。 Go語(yǔ)法和語(yǔ)義設(shè)計(jì)中有很多折衷和權(quán)衡。一個(gè)Go程序員需要相當(dāng)?shù)腉o編程經(jīng)驗(yàn)和感悟才能理解這些權(quán)衡。

Go提供了幾種基本但非必需的類型,比如切片,接口和通道。 Go編譯器和運(yùn)行時(shí)在實(shí)現(xiàn)這些類型的時(shí)候,進(jìn)行了必要的封裝。 一方面,這些封裝為Go編程帶來(lái)了許多便利,使我們不用從頭實(shí)現(xiàn)這些類型。 但另一方面,這些封裝隱藏了這些類型的內(nèi)部結(jié)構(gòu), 從而對(duì)我們更深入地理解這些類型的值的行為帶來(lái)了一些障礙。

許多官方和非官方的Go教程都非常簡(jiǎn)單。 這些教程只涵蓋了一般典型用例,而忽略了許多細(xì)節(jié)。 這對(duì)鼓勵(lì)新手Go程序員學(xué)習(xí)和使用Go非常有好處, 但另一方面,這也使許多Go程序員對(duì)他們的Go知識(shí)掌握程度過(guò)度自信。 從長(zhǎng)遠(yuǎn)看,這不利于一個(gè)Go程序員更好地理解和使用Go。

標(biāo)準(zhǔn)庫(kù)包中聲明的某些函數(shù)和類型沒(méi)有得到詳細(xì)的解釋。很多時(shí)候這是可以理解的。 因?yàn)楹芏嗉?xì)節(jié)解釋起來(lái)很拗口和微妙,有時(shí)很難找到適當(dāng)?shù)拇朐~來(lái)清楚地解釋它們。 少量但準(zhǔn)確的描述比大量但不準(zhǔn)確的描述要好。但這確實(shí)也給Go程序員們留下了一些困惑。

所以你認(rèn)為簡(jiǎn)單不是Go的賣點(diǎn)嗎?

我認(rèn)為,至少簡(jiǎn)單不是Go的主要賣點(diǎn)。畢竟有一些其它語(yǔ)言確實(shí)比Go簡(jiǎn)單。 另一方面,雖然Go是一門特性豐富的語(yǔ)言,但是它卻也不是一門復(fù)雜的語(yǔ)言。 一個(gè)持有積極的學(xué)習(xí)態(tài)度的Go新手程序員可以在一年內(nèi)精通Go編程。

那你覺(jué)得Go的賣點(diǎn)是什么呢?

我個(gè)人的觀點(diǎn)是,做為一門靜態(tài)語(yǔ)言,Go卻和很多動(dòng)態(tài)腳本語(yǔ)言一樣得靈活是Go的主要賣點(diǎn)。

節(jié)省內(nèi)存、程序啟動(dòng)快、代碼執(zhí)行速度快和編譯速度快合在一塊兒是Go的另一個(gè)主要賣點(diǎn)。 雖然這三項(xiàng)是C家族語(yǔ)言的共同特征,但是在Web開發(fā)領(lǐng)域,很少有語(yǔ)言同時(shí)擁有這四個(gè)特征。 事實(shí)上,這就是我當(dāng)初從Java轉(zhuǎn)到Go進(jìn)行Web開發(fā)的原因。

內(nèi)置并發(fā)編程支持也算是Go的賣點(diǎn),雖然我個(gè)人認(rèn)為它不是Go的主要賣點(diǎn)。

良好的代碼可讀性是Go的另一個(gè)重要賣點(diǎn)。 我感覺(jué)可讀性是Go在設(shè)計(jì)的時(shí)候考慮的最重要的一個(gè)因素。

良好的跨平臺(tái)支持也應(yīng)該算是Go的一個(gè)賣點(diǎn),盡管如今這個(gè)賣點(diǎn)并不是很新鮮。

一個(gè)穩(wěn)定的Go核心設(shè)計(jì)和開發(fā)團(tuán)隊(duì)以及一個(gè)活躍的社區(qū)也可以被視為Go的一個(gè)賣點(diǎn)。

《Go語(yǔ)言101》做了什么來(lái)消除Go編程中可能出現(xiàn)的困惑?

《Go語(yǔ)言101》做了以下這些方面來(lái)試圖清除很多Go編程中可能遇到的困惑。

  1. 著重于基本概念和術(shù)語(yǔ)的解釋。如果不理解或者不熟悉這些基本概念和術(shù)語(yǔ),就很難完全理解Go中的很多規(guī)則和高層次的概念。
  2. 使用了值部(value part)這個(gè)術(shù)語(yǔ)并單獨(dú)用一篇文章來(lái)解釋值部。 這篇文章揭示了某些類型的底層結(jié)構(gòu),從而使得Go程序員可以更深入地理解這些類型的值。 我認(rèn)為知道一些可能的底層實(shí)現(xiàn)對(duì)于清除某些Go編程中的困惑非常有幫助。
  3. 詳細(xì)地解釋了內(nèi)存塊(memory block)。 了解Go值和內(nèi)存塊之間的關(guān)系對(duì)于理解垃圾收集器是如何工作的以及如何避免內(nèi)存泄漏非常有幫助。
  4. 將接口值視為用于包裹非接口值的盒子。 我發(fā)現(xiàn)將接口值視為用于包裹非接口值的盒子對(duì)于清除很多和接口相關(guān)的困惑非常有幫助。
  5. 澄清了Go白皮書中的一些含糊描述,包括內(nèi)嵌規(guī)則、提升方法估值和恐慌/恢復(fù)機(jī)制。
  6. 匯總了許多知識(shí)點(diǎn)和細(xì)節(jié),從而可以幫助Go程序員節(jié)省很多學(xué)習(xí)時(shí)間。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)