鍍金池/ 教程/ GO/ 2.1 你好,Go
7 文本處理
3 Web基礎(chǔ)
14 擴(kuò)展Web框架
10.4 小結(jié)
2.2 Go基礎(chǔ)
2.8 總結(jié)
6.1 session和cookie
5.5 使用beedb庫(kù)進(jìn)行ORM開發(fā)
8.3 REST
13.6 小結(jié)
5.4 使用PostgreSQL數(shù)據(jù)庫(kù)
14.6 pprof支持
14.1 靜態(tài)文件支持
11.2 使用GDB調(diào)試
7.7 小結(jié)
1 GO環(huán)境配置
14.5 多語言支持
7.1 XML處理
1.5 總結(jié)
13 如何設(shè)計(jì)一個(gè)Web框架
14.3 表單及驗(yàn)證支持
12 部署與維護(hù)
10 國(guó)際化和本地化
1.1 Go 安裝
6.2 Go如何使用session
5.6 NOSQL數(shù)據(jù)庫(kù)操作
6.5 小結(jié)
9.4 避免SQL注入
12.1 應(yīng)用日志
4.2 驗(yàn)證表單的輸入
10.1 設(shè)置默認(rèn)地區(qū)
1.3 Go 命令
9.6 加密和解密數(shù)據(jù)
4.1 處理表單的輸入
4.4 防止多次遞交表單
11.3 Go怎么寫測(cè)試用例
8 Web服務(wù)
12.3 應(yīng)用部署
5.7 小結(jié)
12.5 小結(jié)
11 錯(cuò)誤處理,調(diào)試和測(cè)試
9.2 確保輸入過濾
14.2 Session支持
6.4 預(yù)防session劫持
12.4 備份和恢復(fù)
8.1 Socket編程
13.1 項(xiàng)目規(guī)劃
13.4 日志和配置設(shè)計(jì)
7.6 字符串處理
13.2 自定義路由器設(shè)計(jì)
6.3 session存儲(chǔ)
3.4 Go的http包詳解
8.2 WebSocket
10.3 國(guó)際化站點(diǎn)
7.5 文件操作
7.4 模板處理
9.1 預(yù)防CSRF攻擊
13.3 controller設(shè)計(jì)
2.6 interface
14.4 用戶認(rèn)證
2.3 流程和函數(shù)
附錄A 參考資料
11.1 錯(cuò)誤處理
9.5 存儲(chǔ)密碼
9.3 避免XSS攻擊
12.2 網(wǎng)站錯(cuò)誤處理
6 session和數(shù)據(jù)存儲(chǔ)
2.4 struct類型
3.3 Go如何使得Web工作
2.5 面向?qū)ο?/span>
3.1 Web工作方式
1.2 GOPATH與工作空間
2.1 你好,Go
9.7 小結(jié)
13.5 實(shí)現(xiàn)博客的增刪改
7.2 JSON處理
10.2 本地化資源
7.3 正則處理
2 Go語言基礎(chǔ)
5.1 database/sql接口
4.5 處理文件上傳
8.5 小結(jié)
4.3 預(yù)防跨站腳本
5.3 使用SQLite數(shù)據(jù)庫(kù)
14.7 小結(jié)
3.2 Go搭建一個(gè)Web服務(wù)器
2.7 并發(fā)
5 訪問數(shù)據(jù)庫(kù)
4 表單
3.5 小結(jié)
1.4 Go開發(fā)工具
11.4 小結(jié)
9 安全與加密
5.2 使用MySQL數(shù)據(jù)庫(kù)
4.6 小結(jié)
8.4 RPC

2.1 你好,Go

在開始編寫應(yīng)用之前,我們先從最基本的程序開始。就像你造房子之前不知道什么是地基一樣,編寫程序也不知道如何開始。因此,在本節(jié)中,我們要學(xué)習(xí)用最基本的語法讓Go程序運(yùn)行起來。

程序

這就像一個(gè)傳統(tǒng),在學(xué)習(xí)大部分語言之前,你先學(xué)會(huì)如何編寫一個(gè)可以輸出hello world的程序。

準(zhǔn)備好了嗎?Let's Go!

package main

import "fmt"

func main() {
    fmt.Printf("Hello, world or 你好,世界 or καλημ ?ρα κóσμ or こんにちはせかい\n")
}

輸出如下:

Hello, world or 你好,世界 or καλημ ?ρα κóσμ or こんにちはせかい

詳解

首先我們要了解一個(gè)概念,Go程序是通過package來組織的

package <pkgName>(在我們的例子中是package main)這一行告訴我們當(dāng)前文件屬于哪個(gè)包,而包名main則告訴我們它是一個(gè)可獨(dú)立運(yùn)行的包,它在編譯后會(huì)產(chǎn)生可執(zhí)行文件。除了main包之外,其它的包最后都會(huì)生成*.a文件(也就是包文件)并放置在$GOPATH/pkg/$GOOS_$GOARCH中(以Mac為例就是$GOPATH/pkg/darwin_amd64)。

每一個(gè)可獨(dú)立運(yùn)行的Go程序,必定包含一個(gè)package main,在這個(gè)main包中必定包含一個(gè)入口函數(shù)main,而這個(gè)函數(shù)既沒有參數(shù),也沒有返回值。

為了打印Hello, world...,我們調(diào)用了一個(gè)函數(shù)Printf,這個(gè)函數(shù)來自于fmt包,所以我們?cè)诘谌兄袑?dǎo)入了系統(tǒng)級(jí)別的fmt包:import "fmt"。

包的概念和Python中的package類似,它們都有一些特別的好處:模塊化(能夠把你的程序分成多個(gè)模塊)和可重用性(每個(gè)模塊都能被其它應(yīng)用程序反復(fù)使用)。我們?cè)谶@里只是先了解一下包的概念,后面我們將會(huì)編寫自己的包。

在第五行中,我們通過關(guān)鍵字func定義了一個(gè)main函數(shù),函數(shù)體被放在{}(大括號(hào))中,就像我們平時(shí)寫C、C++或Java時(shí)一樣。

大家可以看到main函數(shù)是沒有任何的參數(shù)的,我們接下來就學(xué)習(xí)如何編寫帶參數(shù)的、返回0個(gè)或多個(gè)值的函數(shù)。

第六行,我們調(diào)用了fmt包里面定義的函數(shù)Printf。大家可以看到,這個(gè)函數(shù)是通過<pkgName>.<funcName>的方式調(diào)用的,這一點(diǎn)和Python十分相似。

前面提到過,包名和包所在的文件夾名可以是不同的,此處的<pkgName>即為通過package <pkgName>聲明的包名,而非文件夾名。

最后大家可以看到我們輸出的內(nèi)容里面包含了很多非ASCII碼字符。實(shí)際上,Go是天生支持UTF-8的,任何字符都可以直接輸出,你甚至可以用UTF-8中的任何字符作為標(biāo)識(shí)符。

結(jié)論

Go使用package(和Python的模塊類似)來組織代碼。main.main()函數(shù)(這個(gè)函數(shù)位于主包)是每一個(gè)獨(dú)立的可運(yùn)行程序的入口點(diǎn)。Go使用UTF-8字符串和標(biāo)識(shí)符(因?yàn)閁TF-8的發(fā)明者也就是Go的發(fā)明者),所以它天生支持多語言。