跳到主要内容

go 官网教程跟学

· 阅读需 3 分钟

go 的官网教程和主流的编程教程网站风格截然不同,应该是没用任何前端框架,纯手糊出来的 ,有一种老式风格的美。

管理模块(module)

新建一个项目后,首先做的是建立一个go.mod文件,来管理这个模块。模块即项目。go.mod位于项目的根目录。

go mod init <moduleName>

管理包(package)

这里的包可以类比 nodejs 中的库,来自外部。go 只有内置的一种包管理器,不像 node 有那么多选择。导入外部包的步骤是:

  1. 先在文件开头写上import <name>
  2. 运行go mod tidy

go mod tidy会更新go.mod go.sum两个文件的依赖信息。

错误处理

go 的异常处理机制似乎“臭名昭著”。

message, err := greetings.Hello("fads")
// If an error was returned, print it to the console and
// exit the program.
if err != nil {
log.Fatal(err)
}

也就是说,错误没有传递机制,所以,就要写很多的if err != nil

数据结构

slice

slice 是一种没有预先设定长度的数组,故而比较灵活。

formats := []string{
"Hi, %v. Welcome!",
"Great to see you, %v!",
"Hail, %v! Well met!",
}

map

map 就是键值对。需要用一个 make 函数来创建。

// 创建
messages := make(map[string]string)
//赋值
messages[name] = message

测试

go 同样内置了测试机制。创建一个xxx_test.go文件。

package greetings

import (
"testing"
"regexp"
)

// TestHelloName calls greetings.Hello with a name, checking
// for a valid return value.
func TestHelloName(t *testing.T) {
name := "Gladys"
want := regexp.MustCompile(`\b`+name+`\b`)
msg, err := Hello("Gladys")
if !want.MatchString(msg) || err != nil {
t.Fatalf(`Hello("Gladys") = %q, %v, want match for %#q, nil`, msg, err, want)
}
}

// TestHelloEmpty calls greetings.Hello with an empty string,
// checking for an error.
func TestHelloEmpty(t *testing.T) {
msg, err := Hello("")
if msg != "" || err == nil {
t.Fatalf(`Hello("") = %q, %v, want "", error`, msg, err)
}
}

测试函数用 Test 开头。运行测试用例用go test <-v>命令。