在開始編寫應用之前,我們先從最基本的程序開始。就像你造房子之前不知道什么是地基一樣,編寫程序也不知道如何開始。因此,在本節中,我們要學習用最基本的語法讓Go程序運行起來。
## [](https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/02.1.md#程序)程序
這就像一個傳統,在學習大部分語言之前,你先學會如何編寫一個可以輸出`hello world`的程序。
準備好了嗎?Let's Go!
~~~
package main
import "fmt"
func main() {
fmt.Printf("Hello, world or 你好,世界 or καλημ ?ρα κóσμ or こんにちはせかい\n")
}
~~~
輸出如下:
~~~
Hello, world or 你好,世界 or καλημ ?ρα κóσμ or こんにちはせかい
~~~
## [](https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/02.1.md#詳解)詳解
首先我們要了解一個概念,Go程序是通過`package`來組織的
`package `(在我們的例子中是`package main`)這一行告訴我們當前文件屬于哪個包,而包名`main`則告訴我們它是一個可獨立運行的包,它在編譯后會產生可執行文件。除了`main`包之外,其它的包最后都會生成`*.a`文件(也就是包文件)并放置在`$GOPATH/pkg/$GOOS_$GOARCH`中(以Mac為例就是`$GOPATH/pkg/darwin_amd64`)。
> 每一個可獨立運行的Go程序,必定包含一個`package main`,在這個`main`包中必定包含一個入口函數`main`,而這個函數既沒有參數,也沒有返回值。
為了打印`Hello, world...`,我們調用了一個函數`Printf`,這個函數來自于`fmt`包,所以我們在第三行中導入了系統級別的`fmt`包:`import "fmt"`。
包的概念和Python中的package類似,它們都有一些特別的好處:模塊化(能夠把你的程序分成多個模塊)和可重用性(每個模塊都能被其它應用程序反復使用)。我們在這里只是先了解一下包的概念,后面我們將會編寫自己的包。
在第五行中,我們通過關鍵字`func`定義了一個`main`函數,函數體被放在`{}`(大括號)中,就像我們平時寫C、C++或Java時一樣。
大家可以看到`main`函數是沒有任何的參數的,我們接下來就學習如何編寫帶參數的、返回0個或多個值的函數。
第六行,我們調用了`fmt`包里面定義的函數`Printf`。大家可以看到,這個函數是通過`.`的方式調用的,這一點和Python十分相似。
> 前面提到過,包名和包所在的文件夾名可以是不同的,此處的``即為通過`package `聲明的包名,而非文件夾名。
最后大家可以看到我們輸出的內容里面包含了很多非ASCII碼字符。實際上,Go是天生支持UTF-8的,任何字符都可以直接輸出,你甚至可以用UTF-8中的任何字符作為標識符。
## [](https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/02.1.md#結論)結論
Go使用`package`(和Python的模塊類似)來組織代碼。`main.main()`函數(這個函數位于主包)是每一個獨立的可運行程序的入口點。Go使用UTF-8字符串和標識符(因為UTF-8的發明者也就是Go的發明者),所以它天生支持多語言。
- 第一章 Go環境配置
- 1.1 Go安裝
- 1.2 GOPATH 與工作空間
- 1.3 Go 命令
- 1.4 Go開發工具
- 1.5 小結
- 第二章 Go語言基礎
- 2.1 你好,Go
- 2.2 Go基礎
- 2.3 流程和函數
- 2.4 struct類型
- 2.5 面向對象
- 2.6 interface
- 2.7 并發
- 2.8 總結
- 第三章 Web基礎
- 3.1 Web工作方式
- 3.2 Go搭建一個Web服務器
- 3.3 Go如何使得Web工作
- 3.4 Go的http包詳解
- 3.5 小結
- 第四章 表單
- 4.1 處理表單的輸入
- 4.2 驗證表單的輸入
- 4.3 預防跨站腳本
- 4.4 防止多次遞交表單
- 4.5 處理文件上傳
- 4.6 小結
- 第五章 訪問數據庫
- 5.1 database/sql接口
- 5.2 使用MySQL數據庫
- 5.3 使用SQLite數據庫
- 5.4 使用PostgreSQL數據庫
- 5.5 使用beedb庫進行ORM開發
- 5.6 NOSQL數據庫操作
- 5.7 小結
- 第六章 session和數據存儲
- 6.1 session和cookie
- 6.2 Go如何使用session
- 6.3 session存儲
- 6.4 預防session劫持
- 6.5 小結
- 第七章 文本處理
- 7.1 XML處理
- 7.2 JSON處理
- 7.3 正則處理
- 7.4 模板處理
- 7.5 文件操作
- 7.6 字符串處理
- 7.7 小結
- 第八章 Web服務
- 8.1 Socket編程
- 8.2 WebSocket
- 8.3 REST
- 8.4 RPC
- 8.5 小結
- 第九章 安全與加密
- 9.1 預防CSRF攻擊
- 9.2 確保輸入過濾
- 9.3 避免XSS攻擊
- 9.4 避免SQL注入
- 9.5 存儲密碼
- 9.6 加密和解密數據
- 9.7 小結
- 第十章 國際化和本地化
- 10.1 設置默認地區
- 10.2 本地化資源
- 10.3 國際化站點
- 10.4 小結
- 第十一章 錯誤處理,調試和測試
- 11.1 錯誤處理
- 11.2 使用GDB調試
- 11.3 Go怎么寫測試用例
- 11.4 小結
- 第十二章 部署與維護
- 12.1 應用日志
- 12.2 網站錯誤處理
- 12.3 應用部署
- 12.4 備份和恢復
- 12.5 小結
- 第十三章 如何設計一個Web框架
- 13.1 項目規劃
- 13.2 自定義路由器設計
- 13.3 controller設計
- 13.4 日志和配置設計
- 13.5 實現博客的增刪改
- 13.6 小結
- 第十四章 擴展Web框架
- 14.1 靜態文件支持
- 14.2 Session支持
- 14.3 表單及驗證支持
- 14.4 用戶認證
- 14.5 多語言支持
- 14.6 pprof支持
- 14.7 小結
- 附錄A 參考資料