语言特性
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 调试