super go_Go 簡單性的價值:來自對 Go 倍加青睞的谷歌軟件工程師的自述

點擊上方藍色“Go語言中文網”關注我們,領全套Go資料,每天學習?Go?語言

Go 語言最近幾年逐漸獲得越來越多的開發者的喜歡。在 Go 社區前不久剛剛慶祝Go誕生10周年生日之際,谷歌云軟件工程師 Benjamin Congdon 發表個人博客(11 月 11 日發表),表達了自己對 Go 倍加青睞的一些原因。他表示,“簡潔”是他喜歡使用Go語言最重要的原因。原文鏈接:https://benjamincongdon.me/blog/2019/11/11/The-Value-in-Gos-Simplicity/ 以下是譯文:

7d3e03126a9f7651fb302078d239a74a.png

使用 Go 幾年后,我真的很欣賞它的簡單性。我幾個月前開始在工作中使用 Go,發現它真的很容易實現迭代,甚至是比 Python 和 Java 更為復雜的迭代。

當 Go 社區慶祝其成立 10 周年(https://blog.golang.org/10years)時,我正在思考是什么使 Go 變得獨一無二。我認為 Go 的許多真正力量來自其設計師的理念:高度強調向前兼容性,該語言沒有損害可讀性的特性,并且隨手可得。你真正需要的一切它都提供了(包括基本測試庫,可靠的聯網和同步原語以及模板等)。

向前兼容性和依賴性

我認為,相較近期的語言,Go 具有最完善的版本控制和依賴關系。我從未因為 Go 的版本更新而遇到破壞兼容性的情況。這很重要。在相似的時間段內,由于 Rust 的 API 更改,臭名昭著的 Python 2 到 3 過渡,我的項目中斷了,老實說,如果 npm 升級后我的任何舊 JS 項目讓我感到吃驚。

借助 Go,我注意到庫趨于穩定,這似乎讓人擔憂。因為在 Python 和 JavaScript 領域,如果你看到 3 年未更新的庫,則表明該庫已死。而在 Go 生態系統中,你可能可以使用它。在其他社區中被視為停滯或忽視的事物,在 Go 這里反而是復興的標志。

我還注意到,在 Go 中,我需要更少的依賴項,而我的依賴項本身也具有更少的依賴項。Go 沒有將盡可能多的邏輯導出到外部依賴項的文化。Go 社區比其他地方更容易接受代碼重復。這可能令人沮喪。有時,你只想要一個執行某種類型的環境或分析的庫。很多時候,你需要自己編寫該功能,或者從 StackOverflow 答案中復制/粘貼該功能。總的來說,我認為這一點還是利大于弊。更少的依賴項意味著項目閑置幾個月之后被迫中斷的可能性更低。

現在,這對于其他語言、社區可能有點不公平。Rust 尚未達到 Go 所具有的穩定性,這可能是因為它還不是一種成熟的語言,但它正朝著這一方向發展。Python 3 本身已向前兼容,我希望 Python 核心開發人員能從中學到關于硬破損的教訓。在這方面,我對 Javascript 不太抱有希望,但是據說 WebAssembly 和 ES10 將解決我們所有的問題。

Go 的依賴管理并不是沒有問題。有一陣子,depglide 的破裂確實很煩人。并且,盡管 Go Modules 很棒,但社區仍未達到 100% 的采用率。在使用 Go Modules 之前,將所有內容都保留在 $GOPATH 下的要求非常煩人,以至于我推遲了多年進入 Go 的工作。現在情況已經好轉并顯示出改善的跡象。

就向前兼容性而言,自 Go1 發布以來,所有 Go 代碼都可以得到兼容性的保證[1],這會一直運行到 Go2,直到將來的某個不確定的時間點。這是一個強有力的承諾,至少到目前為止,這讓我對這種語言的使用很放心。

“你不需要它”(但你可能想要它)

在使用 Go 一段時間后,我開始想要一些 Go 語言根本不支持的額外功能。嗯,我對 C++ 模板的排斥程度不亞于任何一個人,但是擁有基本的集合類泛型這個要求也不過分,對吧?

開箱即用的唯一兩個通用數據結構是切片(slice)和映射(map)。那是否要編寫自己的數據結構?要么必須針對特定類型進行設置,要么需要盯著一個全是 interface{} 的字段。這兩種方法都各有所長,但有時候,我希望可以只導入類型安全的、通用的、雙向 map。

Go 將“你根本不需要”[2]發揮到了極致。“需要”是這里的重點詞。你“不需要”泛型,但幾乎可以肯定你想要它。這樣的語法糖在錯誤處理、函數式編程和運算符重載上都是上上之選。

那句“陳詞濫調”怎么說來著?有時“少即是多”。除了命名返回值[3]之外,我想不出 Go 語言中的任何讓用戶抓狂的功能了。令人印象深刻的是,Go 核心開發人員對在 Go 中模仿其他語言的開發人員群體表現出了極大了約束。Go2[4] 的未來對我來說真的很令人興奮,因為我很期待看到已經習慣的“下一代” Go 是什么樣子。

包括了足夠你需要的

對于 Go 令人贊嘆的另一點是,它提供了幾乎所有你需要的。

go test 是一個很好的(盡管是基本的)測試框架。你無需成為 JUnit 的領域專家,也無需在 noseunittest 之間進行選擇。為方便起見,有一些測試斷言庫,例如 testify[5],你可以引入它們,但“你并不必須要”。

類似地,Go 的 sync 包涵蓋了你可能需要的大多數同步原語,http提供了可用于生產環境的 HTTP 服務器和客戶端(甚至支持 HTTP2),而且 encoding 包有足夠多的子包可以處理 json、xml、csv 以及許多其他常見格式的數據。

格式化,格式化,格式化(老外也強調重要的事情說三遍)

最后,如果我不提到gofmt,我會很失落。在格式化方面,我有點挑剔。我并不特別在意使用哪些規則,但是我非常在乎一致性。Go 的內部格式化工具 gofmt 已被社區廣泛采用,并提供了足夠的一致性,使 Go 的代碼“看起來”符合 Go 的習語,而不會看代碼看得要抓狂。

就個人而言,我發現使用gofmt可以更輕松地閱讀開源 Go 代碼。每個項目仍然有自己的處理方式,但是每個項目都遵循相同的格式約定。從美學上講,這讓人很高興。


所以,我喜歡 Go。曾經有一段時間,我對 Zen of Python[6] 非常著迷,并且對其他語言不屑一顧。我期待 Go 的美好未來,我可能以后會在 Rust 流行起來之后,去用 Rust 趕一波時髦,因為我確實喜歡一些類似于函數式的編程。

但是現在,我非常愿意繼續使用 Go 語言。

文中鏈接

[1]

保證: https://golang.org/doc/go1compat

[2]

“你根本不需要”: https://www.martinfowler.com/bliki/Yagni.html

[3]

命名返回值: http://tour.studygolang.com/basics/7

[4]

Go2: https://github.com/golang/go/wiki/Go2

[5]

testify: https://github.com/stretchr/testify

[6]

Zen of Python: https://www.python.org/dev/peps/pep-0020/

推薦閱讀

  • 深度長文:深入Go Runtime,你能做到淺出嗎?

  • 為什么golang沒有volatile?


喜歡本文的朋友,歡迎關注“Go語言中文網”:

7fa0df70c55e7cb26ec658b6885001f5.png

Go語言中文網啟用微信學習交流群,歡迎加微信:274768166

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539118.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539118.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539118.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

判斷鼠標是否在元素上_是否清掃保潔、是否霧撒降塵?江城環衛車裝上了北斗,動動鼠標就知道了...

楚天都市報12月1日訊(記者盧成漢 通訊員金嬋 潘婷)環衛車裝上北斗定位系統,它是否上路進行清掃保潔,是否霧撒降塵。城管隊員通過手機或電腦,就可以查到它的運行狀態。1日,東湖高新區城管執法局稱,該區運行的北斗智能環…

Object 對象詳解

2019獨角獸企業重金招聘Python工程師標準>>> 面向對象的核心思想:“找合適的對象,做適合的事情”。 合適的對象: 1. 自己描述類,自己創建對象。 2. sun已經描述了好多常用的類,可以使用這些類創建對象。 API&#xff0…

vi/vim命令

概述 vi: Visual Interface vim: VI iMproved vim模式 有三種: 編輯模式(命令模式) 如:通過命令新增一行,刪除一行,復制一行,光標移動等 輸入模式 輸入模式在屏幕末尾一定有這個“-- INSERT --” 末行模式 ESC&…

python條件判斷true_Python中的True,False條件判斷實例分析

本文實例講述了Python中的True,False條件判斷用法。分享給大家供大家參考。具體分析如下:對于有編程經驗的程序員們都知道條件語句的寫法:以C為例:代碼如下:if (condition){doSomething();}對于Python中的條件判斷語句的寫法則是下面的樣子&a…

python安裝報錯類型_解決Python安裝cryptography報錯問題

解決Python安裝cryptography報錯問題錯誤一:gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -DUSE__THREAD -DHAVE_SYNC_SYNCHRONIZE -I/usr/include/ffi -I/usr/include/libffi -I/usr/include/python2.7 -c c/_cffi…

使用ntpdate校正linux系統的時間

原文地址:http://blog.csdn.net/lixianlin/article/details/7045321 ------------------------------------------------------------------------------------- 當Linux服務器的時間不對的時候,可以使用ntpdate工具來校正時間。 安裝:yum in…

Visual Studio 2017 15.6發布

\看新聞很累?看技術新聞更累?試試下載InfoQ手機客戶端,每天上下班路上聽新聞,有趣還有料!\\\微軟發布了Visual Studio 2017的第6次升級。和之前的發布一樣,此次升級包含多項Bug修復和整個IDE使用體驗的改善…

主mysql刪除從服務不同步_MySQL主從不同步解決

由于binlog日志帶多刪除了幾個后發現MySQL主從不同步1、由于binlog日志帶多刪除了幾個后發現MySQL主從不同步mysql> show slave status\G;Slave_IO_Running: NoSlave_SQL_Running: Yes查看報錯日志為[ERROR] Slave I/O: Got fatal error 1236 from master when reading data…

python切片是什么_python列表切片是什么

我們基本上都知道Python的序列對象都是可以用索引號來引用的元素的,索引號可以是正數由0開始從左向右,也可以是負數由-1開始從右向左。在Python中對于具有序列結構的數據來說都可以使用切片操作,需注意的是序列對象某個索引位置返回的是一個元…

cat-grep-sed應用案例

案例&#xff1a; 已知文件test.txt內容為&#xff1a; test liming xiaoming 請打印出test.txt內容時&#xff0c;不包含xiaoming字符串的命令。 創建文件test.txt [roothello110 testdata]# cat >>test.txt<<EOF > test > liming > xiaoming >…

機器學習(一)梯度下降算法的實現及過程分析

機器學習&#xff08;一&#xff09;梯度下降算法 因為算法最好能應用到實際問題中才會讓讀者感到它的真實的用處&#xff0c;因此首先我來描述一個實際問題&#xff08;梯度下降算法用以幫助解決該問題&#xff09;&#xff1a;給定一個指定的數據集&#xff0c;比如由若干某一…

quick time不可用_那些校園中“不可言說”的鄙視鏈

原標題&#xff1a;那些校園中“不可言說”的鄙視鏈俗話說&#xff0c;有人的地方就有江湖&#xff0c;有江湖的地方總有人喜歡論論劍&#xff0c;分個高低&#xff0c;更何況是聚集了五湖四海人群的大學呢&#xff01;今天小U總結出了一篇高校鄙視鏈大全&#xff0c;快來看看符…

select怎么設置默認值_20200817:詳細說下數據傾斜怎么解決?

福哥答案2020-08-17&#xff1a;數據傾斜是大數據領域繞不開的攔路虎&#xff0c;當你所需處理的數據量到達了上億甚至是千億條的時候&#xff0c;數據傾斜將是橫在你面前一道巨大的坎。很可能有幾周甚至幾月都要頭疼于數據傾斜導致的各類詭異的問題。數據傾斜是指&#xff1a;…

邢不行python資源_邢不行—數字貨幣python量化投資

本帖最后由 ynjie 于 2020-10-14 21:39 編輯課時1.1 什么是量化投資.mp4課時1.2 數字貨幣市場特點.mp4課時1.3 2018量化炒幣7大玩法復盤.mp4課時1.4 量化策略案例&#xff1a;Excel演示定投策略.mp4課時1.5 量化策略案例&#xff1a;Python演示定投策略.mp4課時1.6 量化策略案例…

數據庫查詢某一列大寫轉化小寫字母表示_基于MySQL數據庫下億級數據的分庫分表...

移動互聯網時代&#xff0c;海量的用戶數據每天都在產生&#xff0c;基于用戶使用數據的用戶行為分析等這樣的分析&#xff0c;都需要依靠數據都統計和分析&#xff0c;當數據量小時&#xff0c;數據庫方面的優化顯得不太重要&#xff0c;一旦數據量越來越大&#xff0c;系統響…

ASP.NET Core Docker Jenkins 零基礎持續集成實戰

一.本系列教程說明 源代碼管理工具&#xff1a;Gogs 持續集成工具&#xff1a;Jenkins 容器&#xff1a;Docker 二.git管理軟件的選擇 沒有采用gitlab&#xff0c;因為gitlab比較吃配置&#xff0c;至少得2核4G的配置。采用go語言開發的gogs來代替&#xff0c;搭建方便(不到10分…

vs 啟動調用的目標發生異常_協程中的取消和異常 | 取消操作詳解

在日常的開發中&#xff0c;我們都知道應該避免不必要的任務處理來節省設備的內存空間和電量的使用——這一原則在協程中同樣適用。您需要控制好協程的生命周期&#xff0c;在不需要使用的時候將它取消&#xff0c;這也是結構化并發所倡導的&#xff0c;繼續閱讀本文來了解有關…

java http 下載文件_JAVA通過HttpURLConnection 上傳和下載文件的方法

本文介紹了JAVA通過HttpURLConnection 上傳和下載文件的方法&#xff0c;分享給大家&#xff0c;具體如下&#xff1a;HttpURLConnection文件上傳HttpURLConnection采用模擬瀏覽器上傳的數據格式&#xff0c;上傳給服務器上傳代碼如下&#xff1a;package com.util;import java…

mkdir-yum-tree命令應用案例

案例&#xff1a; 請用一條命令完成目錄創建/hello/world/test 解答&#xff1a; mkdir -p /hello/world/test -p 遞歸創建目錄&#xff0c;沒有子目錄創建。 案例&#xff1a; 打印hello/目錄的結構 [roothello110 ~]# tree hello/ -bash: tree: command not found 發…