跳到主要内容

Go 官网教程跟学

· 阅读需 6 分钟

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 语言中,变量的声明和初始化可以通过多种方式实现,具体取决于你是否需要显式指定变量类型。以下是几种常见的方式:

  1. 使用 var 关键字声明并初始化变量 Go 允许你使用 var 关键字声明变量并指定初始值:
var 变量名 数据类型 = 初始值

示例:

var age int = 25
var name string = "Alice"
  1. 类型推断

如果你在声明时赋予了初始值,Go 可以根据初始值推断变量的类型,因此可以省略类型:

var age = 25
var name = "Alice"
  1. 简短声明(:=)

在函数内部,使用 := 可以简化变量的声明和初始化。这是一种常用的简写方式,不需要 var 关键字,也不需要显式指定类型:

age := 25
name := "Alice"
  1. 声明多个变量

你可以一次声明多个变量,使用 var 或简短声明方式:

var a, b, c int = 1, 2, 3
x, y := "Hello", "World"
  1. 声明但不初始化

如果不指定初始值,Go 会为变量赋予其默认值(零值),如 int 默认值为 0string 默认值为 ""bool 默认值为 false

var age int     // 默认值为 0
var name string // 默认值为 ""

示例

package main

import "fmt"

func main() {
var age int = 30 // 声明并初始化
var name = "Bob" // 类型推断
height := 1.75 // 简短声明
var isStudent bool // 声明但不初始化,默认值为 false

fmt.Println(age, name, height, isStudent)
}

关键点

  • 使用 var 关键字可以在函数外部和内部声明变量。

  • 简短声明 := 只能在函数内部使用。

  • Go 强调显式和简洁的变量声明风格,类型推断和简短声明常用于简化代码。

函数定义方式

在 Go 语言中,函数的定义语法如下:

func 函数名(参数列表) 返回值类型 {
// 函数体
}

下面是一个具体的例子:

package main

import "fmt"

// 定义一个无返回值的函数
func sayHello() {
fmt.Println("Hello, Go!")
}

// 定义一个带参数和返回值的函数
func add(a int, b int) int {
return a + b
}

func main() {
// 调用无返回值的函数
sayHello()

// 调用带参数和返回值的函数
sum := add(5, 7)
fmt.Println("Sum:", sum)
}

关键点:

  1. func 关键字用于定义函数。

  2. 参数列表中的每个参数都需要指定类型。如果多个参数类型相同,可以将类型合并,例如 func add(a, b int) int

  3. 返回值类型放在参数列表后面。

  4. 函数可以有多个返回值,返回值使用括号括起来,例如 func swap(a, b int) (int, int)

错误处理

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>命令。