老規(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!
標新立異不是你的錯惜互,可長得丑就是你的錯了
每一個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ā)效率换棚,顏值是低了點式镐,可還是能讓人喜歡上的哈哈哈哈。
先挖坑在這里了固蚤,如果有想看的娘汞,點個贊我盡快寫哈 =。=
原文轉自謝培陽的博客