語言特性
Go語言作為一門靜態類型語言,有很多新的特性
1. 自動垃圾回收
2. 更豐富的內置類型,增加了字典map ,數組切片slice
3. 函數多返回值
4. 錯誤處理: defer panic recover
5. 匿名函數和閉包
6. 并發編程
7. 反射
8. 語言交互性
雖然不太了解這些特性,但是之后應該會逐步深入,此處先記下。
第一個程序
package main
import "fmt"
func main() {
fmt.Printf("hello, world\n")
}
環境:debian 8.6 + vscode,安裝golang
apt isntall golang
程序注意的地方:
- package 聲明: 表示該代碼所屬的包,go 語言中最基本的分發單位
- import 導入改程序所依賴的所有包
- main : 主函數既不能有參數,也不能有返回值
編譯環境
`go version`
`go version go1.3.3 linux/amd64`
`go build hello.go`
`go run hello.go`
工程管理
開發一個計算器的工程項目:
- src: 源碼文件夾
- pkg: 包被安裝到這里
- bin: 生成的二進制文件
源碼
1. calc.go
//Package main
package main
import "os"
import "fmt"
import "./simplemath"
import "strconv"
//Usage 匿名函數?
var Usage = func() {
fmt.Println("USAGE: calc command [arguments] ...")
fmt.Println("\nThe command are:\n\tadd\tAddition of two values.\n\tsqrt\tSquare")
}
func main() {
args := os.Args
if args == nil || len(args) < 2 {
Usage()
return
}
switch args[1] {
case "add":
if len(args) != 4 {
fmt.Println("Usage: calc add <integer1> <integer2>")
return
}
v1, err1 := strconv.Atoi(args[2])
v2, err2 := strconv.Atoi(args[3])
if err1 != nil || err2 != nil {
fmt.Println("Usage: calc add <integer1> <integer2>")
return
}
ret := simplemath.Add(v1, v2)
fmt.Println("Result: ", ret)
default:
//Usage()
}
}
2. /simplemath/add.go
//Package simplemath...
package simplemath
// Add a and b
func Add(a int, b int) int {
return a + b
}
3. /simplemath/add_test.go
//Package simplemath
package simplemath
import "testing"
func TestAdd(t *testing.T) {
r := Add(1, 2)
if r != 3 {
t.Errorf("Add(1,2) failed. Got %d, expecrted 3.\r", r)
}
}
4. 生成,運行。注:生成的二進制文件,不依賴開發環境,一次編譯到處運行?
問題追蹤和調試
go使用盡量簡單的語法,和盡量完善的庫。如果出現了問題,需要調試,主要兩種跟蹤方法:打印日志和GDB逐步調試。
- 打印日志
fmt.Printf 和 fmt.Println - GDB 調試