Golang系列之為什么你能這么丑(一)

logo-go.png

老規(guī)矩碟刺,開始學習新編程語言的第一步跋核,來個hello world咯粥庄。
要對得起go的名聲丧失,就來個web版的hello world吧2333

package main

import (
    "fmt"
    "net/http"
)

type Hello struct{}

func (h Hello) ServeHTTP(w http.ResponseWriter,r *http.Request) {
    fmt.Fprint(w, "Hello World!")
}

func main() {
    var h Hello
    http.ListenAndServe("localhost:2333", h)
}

$ go run main.go
瀏覽器打開localhost:2333,Hello World!

hellogo.png

標新立異不是你的錯惜互,可長得丑就是你的錯了

每一個go程序都是包布讹,這里導出包名為main
package main
導入包,fmt用于輸入輸出训堆,net/http用于http服務

import(
    "fmt"
    "net/http"
)

命名一個結構體
type Hello struct{}
為Hello結構體類型添加方法描验,實現(xiàn)了ServeHTTP接口

func (h Hello) ServeHTTP(w http.ResponseWriter,r *http.Request) {
    fmt.Fprint(w, "Hello World!")
}

入口函數(shù),先聲明h坑鱼,再啟動http監(jiān)聽服務

func main() {
    var h Hello
    http.ListenAndServe("localhost:2333", h)
}

看完上面這一小段程序膘流,現(xiàn)在的你什么想法?
反正我敲完hello world鲁沥,是被丑哭了T T

變量聲明

包管理還算中規(guī)中矩呼股,可聲明變量的語法,画恰,彭谁,你看看
聲明一個int
var i int
初始化
var i int = 1

i := 1
聲明一個int指針,最后一種方式會由編譯器進行自動推導類型
var p *int 或 var p *int = &i 或 p := &i
是的你沒看錯,類型是放后面允扇,和C系語言是反著來的
Golang發(fā)明者說缠局,這樣做是因為C系語言的變量聲明方法不好,哪里不好了呢考润,拿函數(shù)指針舉了個栗子
聲明一個簡單的C函數(shù)指針
int (*fp)(int a, int b)
不難理解吧fp是一個函數(shù)指針狭园,接受兩個int參數(shù),返回類型也是int额划。這里將fp插入聲明的類型中去妙啃,很直觀。
可是如果復雜一點俊戳,第一個參數(shù)也是個函數(shù)指針呢
int (*fp)(int (*ff)(int x, int y), int b)
將int a 替換成 int (*ff)(int x, int y)就是了揖赴,已經有點難以直接看懂了是不是。當然可以省略變量名試一下
int (*fp)(int (*)(int ,int), int)
上面這樣還是算可以瞄一下看懂的抑胎,可是萬一燥滑,這個函數(shù)指針的返回類型也是一個函數(shù)指針呢,阿逃,铭拧,赃蛛,
int (*(*fp)(int (*)(int, int), int))(int, int)
誰能一下子看懂我就服了,會出現(xiàn)這樣難以閱讀的問題搀菩,是因為C的函數(shù)指針聲明呕臂,將變量名字插入聲明類型本身中去了。這樣你就要一會從右往左讀一會又要從左往右讀

那如果是Go的話肪跋,會怎樣聲明呢
f func(func(int,int) int, int) func(int, int)int
變量名字和類型本身分開了歧蒋,變量名字放前面,類型在后面州既,從始至終由左往右讀谜洽。func表示這是個函數(shù),括號開始吴叶,接下來func表示第一個參數(shù)也是個函數(shù)阐虚,這個函數(shù)參數(shù)是兩個int,其返回類型是int蚌卤,也即func(int ,int) int实束,接下來還有個int參數(shù),括號結束造寝。然后是這個函數(shù)的返回類型磕洪,返回類型為func(int, int) int,即這個返回類型是接受兩個int參數(shù)返回一個int的函數(shù)诫龙。

嗯,鲫咽,签赃,看起來不明覺厲吧,我是覺得這真是品味問題分尸,不關可讀性的事锦聊,C系語言的聲明方式挺好的,除了函數(shù)指針這一塊有點繞之外箩绍,沒其他壞處孔庭。而var i int = 1,這也太丑了點吧=材蛛。=

你的 { 放哪里

這也是個個人品味問題了吧圆到。愛放哪放哪,
見過的大概三種

int main()
{
     if(,,,)
     {
         ,,,,,
     }
     else
     {
          ,,,,
     }
}
int main()
{
     if(,,,,,) {
         ,,,,
     }else {
         ,,,,
     }
}
int main() {
     if(,,,,,) {
          ,,,
     }else {
          ,,,
     }
}

項目中肯定要統(tǒng)一卑吭,但是語言不應該強求程序員要用哪種芽淡,Python強制縮進都罵聲一片了,go更作死豆赏,所有 { 必須在行后挣菲,不可以另起一行富稻!否則編譯都不讓過。幸虧我早習慣了google編程風格那一套白胀,對我沒影響椭赋,可是就是不開森。用哪種是一回事或杠,能不能自由選擇又是另外一回事哪怔。我覺得Google Golang開發(fā)團隊有點將個人喜好強加給其他開發(fā)者了。

沒有類廷痘,只有接口

回過頭來看hello world
http.ListenAndServe("localhost:2333", h)
這一句做了什么呢蔓涧?它綁定了一個端口,請求交給h處理笋额,那h是個什么東西呢元暴?是我們剛剛聲明的類型Hello,只要Hello實現(xiàn)了接口ServeHTTP兄猩,就能作為參數(shù)傳給http.ListenAndServe茉盏。
在package http中,這個接口是這樣定義的

package http

type Handler interface {
  ServeHTTP(w ResponseWriter, r *Request)
}

然后我們?yōu)镠ello 實現(xiàn)這個接口枢冤,http.ResponseWrite和http,Request由http.Handler負責傳入鸠姨,我們只要將"Hello World!"寫入ResponseWrite中就好了。

func (h Hello) ServeHTTP(w http.ResponseWriter,r *http.Request) {
    fmt.Fprint(w, "Hello World!")
}

如果你寫過其他語言的類似http服務淹真,就會知道這完全是兩個世界的東西啊讶迁。。核蘸。丑不丑見仁見智咯巍糯。

關于Golang系列

最近在學Golang,想把所學的整理出來成為一個系列客扎,這是第一篇祟峦。hello world入門級別。
語法不會細說徙鱼,主要寫Go的并發(fā)處理宅楞。這也是Golang的主戰(zhàn)場。

感覺Golang作為工程語言是合適的袱吆,尤其在后端開發(fā)厌衙,高并發(fā)的應用場景很是適合,加上編譯完成就是二進制包杆故,不需要像python或者java那樣另外裝運行壞境迅箩,部署方便。而且性能也是6666的处铛,Golang = C++的性能 + Python的開發(fā)效率饲趋,畢竟Google是它爹啊拐揭。而對于語言本身呢,除了并發(fā)原生支持那一塊奕塑,就乏善可陳了堂污,離學院派很是遙遠×渑椋可是可是盟猖,又有C++的性能,又有Python的開發(fā)效率换棚,顏值是低了點式镐,可還是能讓人喜歡上的哈哈哈哈。

先挖坑在這里了固蚤,如果有想看的娘汞,點個贊我盡快寫哈 =。=


原文轉自謝培陽的博客

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末夕玩,一起剝皮案震驚了整個濱河市你弦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌燎孟,老刑警劉巖禽作,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異揩页,居然都是意外死亡旷偿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門爆侣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狸捅,“玉大人,你說我怎么就攤上這事累提。” “怎么了磁浇?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵斋陪,是天一觀的道長。 經常有香客問我置吓,道長无虚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任衍锚,我火速辦了婚禮友题,結果婚禮上,老公的妹妹穿的比我還像新娘戴质。我一直安慰自己度宦,他們只是感情好踢匣,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著戈抄,像睡著了一般离唬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上划鸽,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天输莺,我揣著相機與錄音,去河邊找鬼裸诽。 笑死嫂用,一個胖子當著我的面吹牛,可吹牛的內容都是我干的丈冬。 我是一名探鬼主播嘱函,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼殷蛇!你這毒婦竟也來了实夹?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤粒梦,失蹤者是張志新(化名)和其女友劉穎亮航,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匀们,經...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡缴淋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了泄朴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片重抖。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖祖灰,靈堂內的尸體忽然破棺而出钟沛,到底是詐尸還是另有隱情,我是刑警寧澤局扶,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布恨统,位于F島的核電站,受9級特大地震影響三妈,放射性物質發(fā)生泄漏畜埋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一畴蒲、第九天 我趴在偏房一處隱蔽的房頂上張望悠鞍。 院中可真熱鬧,春花似錦模燥、人聲如沸咖祭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽心肪。三九已至锭亏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間硬鞍,已是汗流浹背慧瘤。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留固该,地道東北人锅减。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像伐坏,于是被迫代替她去往敵國和親怔匣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內容