Go

精选 Go 常用指令与核心速查备忘单,涵盖高频用法、配置参数与实用技巧。 Go (Golang) 编程语言基础语法、并发控制与常用内置库极速备忘单。

#入门指南 (Getting Started)

#hello.go 示例 (Hello World)

package main

import "fmt"

func main() {
    fmt.Println("Hello, world!")
}

直接运行代码

$ go run hello.go
Hello, world!

Go Playground 在线环境 中在线体验

#变量声明 (Variables)

var s1 string
s1 = "Learn Go!"

# 一次性声明多个变量
var b, c int = 1, 2
var d = true

短变量简写语法 (:=)

s1 := "Learn Go!"        // string 类型推导
b, c := 1, 2             // int 类型推导
d := true                // bool 类型推导

参阅: 基础数据类型

#函数定义 (Functions)

package main

import "fmt"

// 程序的入口主函数
func main() {
    fmt.Println("Hello world!")
    say("Hello Go!")
}

func say(message string) {
    fmt.Println("输出消息: ", message)
}

参阅: 函数详解

#代码注释 (Comments)

// 单行注释

/* 多行
   注释 */

#条件分支 (Conditionals)

if true {
    fmt.Println("条件成立!")
}

参阅: 流程控制

#Go 基础数据类型

#字符串 (Strings)

s1 := "Hello" + "World"

s2 := `原始多行字符串字面量 (Raw string)
可以包含换行符。`

// 输出: 10 (字符串长度)
fmt.Println(len(s1))

// 输出: Hello (切片)
fmt.Println(string(s1[0:5]))

字符串在 Go 中属于 string 类型。

#数字类型 (Numbers)

num := 3         // int 整型
num := 3.        // float64 浮点型
num := 3 + 4i    // complex128 复数型
num := byte('a') // byte (uint8 别名)

var u uint = 7        // uint 无符号整型
var p float32 = 22.7  // 32 位浮点数

#数值运算符 (Operators)

x := 5
x++
fmt.Println("x + 4 =", x + 4)
fmt.Println("x * 4 =", x * 4)

参阅: 运算符详解

#布尔类型 (Booleans)

isTrue   := true
isFalse  := false

#逻辑运算符

fmt.Println(true && true)   // true
fmt.Println(true && false)  // false
fmt.Println(true || true)   // true
fmt.Println(true || false)  // true
fmt.Println(!true)          // false

参阅: 运算符详解

#数组 (Arrays)

┌────┬────┬────┬────┬─────┬─────┐
| 2  | 3  | 5  | 7  | 11  | 13  |
└────┴────┴────┴────┴─────┴─────┘
  0    1    2    3     4     5

primes := [...]int{2, 3, 5, 7, 11, 13}
fmt.Println(len(primes)) // => 6

// Outputs: [2 3 5 7 11 13]
fmt.Println(primes)

// Same as [:3], Outputs: [2 3 5]
fmt.Println(primes[0:3])

var a [2]string
a[0] = "Hello"
a[1] = "World"

fmt.Println(a[0], a[1]) //=> Hello World
fmt.Println(a)   // => [Hello World]

#2d array

var twoDimension [2][3]int
for i := 0; i < 2; i++ {
    for j := 0; j < 3; j++ {
        twoDimension[i][j] = i + j
    }
}
// => 2d:  [[0 1 2] [1 2 3]]
fmt.Println("2d: ", twoDimension)

#指针 (Pointers)

func main () {
  b := *getPointer()
  fmt.Println("Value is", b)
}
func getPointer () (myPointer *int) {
  a := 234
  return &a
}
a := new(int)
*a = 234

See: Pointers

#切片 (Slices)

s := make([]string, 3)
s[0] = "a"
s[1] = "b"
s = append(s, "d")
s = append(s, "e", "f")

fmt.Println(s)
fmt.Println(s[1])
fmt.Println(len(s))
fmt.Println(s[1:3])

slice := []int{2, 3, 4}

See also: Slices example

#常量 (Constants)

const s string = "constant"
const Phi = 1.618
const n = 500000000
const d = 3e20 / n
fmt.Println(d)

#类型转换 (Type conversions)

i := 90
f := float64(i)
u := uint(i)

// Will be equal to the character Z
s := string(i)

#How to get int string?

i := 90

// need import "strconv"
s := strconv.Itoa(i)
fmt.Println(s) // Outputs: 90

#Go 字符串操作

#字符串常用函数 (Strings Functions)

package main

import (
	"fmt"
	s "strings"
)

func main() {
    /* Need to import strings as s */
	fmt.Println(s.Contains("test", "e"))

    /* Build in */
    fmt.Println(len("hello"))  // => 5
    // Outputs: 101
	fmt.Println("hello"[1])
    // Outputs: e
	fmt.Println(string("hello"[1]))

}

#格式化输出 fmt.Printf

package main

import (
	"fmt"
	"os"
)

type point struct {
	x, y int
}

func main() {
	p := point{1, 2}
	fmt.Printf("%v\n", p)                        // => {1 2}
	fmt.Printf("%+v\n", p)                       // => {x:1 y:2}
	fmt.Printf("%#v\n", p)                       // => main.point{x:1, y:2}
	fmt.Printf("%T\n", p)                        // => main.point
	fmt.Printf("%t\n", true)                     // => TRUE
	fmt.Printf("%d\n", 123)                      // => 123
	fmt.Printf("%b\n", 14)                       // => 1110
	fmt.Printf("%c\n", 33)                       // => !
	fmt.Printf("%x\n", 456)                      // => 1c8
	fmt.Printf("%f\n", 78.9)                     // => 78.9
	fmt.Printf("%e\n", 123400000.0)              // => 1.23E+08
	fmt.Printf("%E\n", 123400000.0)              // => 1.23E+08
	fmt.Printf("%s\n", "\"string\"")             // => "string"
	fmt.Printf("%q\n", "\"string\"")             // => "\"string\""
	fmt.Printf("%x\n", "hex this")               // => 6.86578E+15
	fmt.Printf("%p\n", &p)                       // => 0xc00002c040
	fmt.Printf("|%6d|%6d|\n", 12, 345)           // => |    12|   345|
	fmt.Printf("|%6.2f|%6.2f|\n", 1.2, 3.45)     // => |  1.20|  3.45|
	fmt.Printf("|%-6.2f|%-6.2f|\n", 1.2, 3.45)   // => |1.20  |3.45  |
	fmt.Printf("|%6s|%6s|\n", "foo", "b")        // => |   foo|     b|
	fmt.Printf("|%-6s|%-6s|\n", "foo", "b")      // => |foo   |b     |

	s := fmt.Sprintf("a %s", "string")
	fmt.Println(s)

	fmt.Fprintf(os.Stderr, "an %s\n", "error")
}

See also: fmt

#函数使用示例 (Function Examples)

Example Result
Contains("test", "es") true
Count("test", "t") 2
HasPrefix("test", "te") true
HasSuffix("test", "st") true
Index("test", "e") 1
Join([]string{"a", "b"}, "-") a-b
Repeat("a", 5) aaaaa
Replace("foo", "o", "0", -1) f00
Replace("foo", "o", "0", 1) f0o
Split("a-b-c-d-e", "-") [a b c d e]
ToLower("TEST") test
ToUpper("test") TEST

#Go 流程控制

#条件分支 (Conditionals)


a := 10

if a > 20 {
    fmt.Println(">")
} else if a < 20 {
    fmt.Println("<")
} else {
    fmt.Println("=")
}

#if 条件初始化表达式 (Statements in If)

x := "hello go!"

if count := len(x); count > 0 {
    fmt.Println("Yes")
}



if _, err := doThing(); err != nil {
    fmt.Println("Uh oh")
}

#Switch 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch) 分支语句 (Switch)

x := 42.0
switch x {
case 0:
case 1, 2:
    fmt.Println("Multiple matches")
case 42:   // Don't "fall through".
    fmt.Println("reached")
case 43:
    fmt.Println("Unreached")
default:
    fmt.Println("可选")
}

See: Switch

#For 基础循环 (For Loop)

for i := 0; i <= 10; i++ {
  fmt.Println("i: ", i)
}

#For-Range 迭代循环 (For-Range Loop)

nums := []int{2, 3, 4}
sum := 0
for _, num := range nums {
    sum += num
}
fmt.Println("sum:", sum)

#While 形式循环 (While Loop)

i := 1
for i <= 3 {
    fmt.Println(i)
    i++
}

#continue 跳过本次循环

for i := 0; i <= 5; i++ {
    if i % 2 == 0 {
        continue
    }
    fmt.Println(i)
}

#break 中断退出循环

for {
    fmt.Println("loop")
    break
}

#Go 结构体与字典 (Structs & Maps)

#结构体定义 (Defining)

package main

import (
	"fmt"
)

type Vertex struct {
	X int
	Y int
}

func main() {
	v := Vertex{1, 2}
	v.X = 4
	fmt.Println(v.X, v.Y) // => 4 2
}

See: Structs

#结构体字面量 (Literals)

v := Vertex{X: 1, Y: 2}
// Field names can be omitted
v := Vertex{1, 2}
// Y is implicit
v := Vertex{X: 1}

You can also put field names.

#字典映射 (Maps)

m := make(map[string]int)
m["k1"] = 7
m["k2"] = 13
fmt.Println(m) // => map[k1:7 k2:13]

v1 := m["k1"]
fmt.Println(v1)     // => 7
fmt.Println(len(m)) // => 2

delete(m, "k2")
fmt.Println(m) // => map[k1:7]

_, prs := m["k2"]
fmt.Println(prs) // => false

n := map[string]int{"foo": 1, "bar": 2}
fmt.Println(n) // => map[bar:2 foo:1]

#指针 (Pointers) to structs

v := &Vertex{1, 2}
v.X = 2

Doing v.X is the same as doing (*v).X, when v is a pointer.

#Go 函数高级用法

#多参数传递 (Multiple Arguments)

func plus(a int, b int) int {
    return a + b
}
func plusPlus(a, b, c int) int {
    return a + b + c
}
fmt.Println(plus(1, 2))
fmt.Println(plusPlus(1, 2, 3))

#多返回值 (Multiple Returns)

func vals() (int, int) {
    return 3, 7
}

a, b := vals()
fmt.Println(a)    // => 3
fmt.Println(b)    // => 7

#函数字面量与匿名函数

r1, r2 := func() (string, string) {
    x := []string{"hello", "qr.warpnav.com"}
    return x[0], x[1]
}()

// => hello qr.warpnav.com
fmt.Println(r1, r2)

#命名返回值/裸返回 (Naked Returns)

func split(sum int) (x, y int) {
  x = sum * 4 / 9
  y = sum - x
  return
}

x, y := split(17)
fmt.Println(x)   // => 7
fmt.Println(y)   // => 10

Note that using naked returns hurts readability.

#可变参数函数 (Variadic Functions)

func sum(nums ...int) {
    fmt.Print(nums, " ")
    total := 0
    for _, num := range nums {
        total += num
    }
    fmt.Println(total)
}
sum(1, 2)     //=> [1 2] 3
sum(1, 2, 3)  // => [1 2 3] 6

nums := []int{1, 2, 3, 4}
sum(nums...)  // => [1 2 3 4] 10

#init 包初始化函数

import --> const --> var --> init()

var num = setNumber()

func setNumber() int {
    return 42
}
func init() {
    num = 0
}
func main() {
    fmt.Println(num) // => 0
}

#函数作为一等公民 (Functions as Values)

func main() {
    // assign a function to a name
    add := func(a, b int) int {
        return a + b
    }
    // use the name to call the function
    fmt.Println(add(3, 4)) // => 7
}

#闭包示例 1 (Closures 1)

func scope() func() int{
    outer_var := 2
    foo := func() int {return outer_var}
    return foo
}

// Outpus: 2
fmt.Println(scope()())

#闭包示例 2 (Closures 2)

func outer() (func() int, int) {
    outer_var := 2
    inner := func() int {
        outer_var += 99
        return outer_var
    }
    inner()
    return inner, outer_var
}
inner, val := outer()
fmt.Println(inner()) // => 200
fmt.Println(val)     // => 101

#Go 包管理与导包

#导包方式 (Importing)

import "fmt"
import "math/rand"

#Same as

import (
  "fmt"        // gives fmt.Println
  "math/rand"  // gives rand.Intn
)

See: Importing

#包别名 (Aliases)

import r "math/rand"

import (
    "fmt"
    r "math/rand"
)

r.Intn()

#包的定义 (Packages)

package main

// An internal package may be imported only by another package
// that is inside the tree rooted at the parent of the internal directory
package internal

See: Internal packages

#导出成员/首字母大写 (Exporting Names)

// Begin with a capital letter
func Hello () {
  ···
}

See: Exported names

#Go 并发编程 (Concurrency)

#协程 (Goroutines)

package main

import (
	"fmt"
	"time"
)

func f(from string) {
	for i := 0; i < 3; i++ {
		fmt.Println(from, ":", i)
	}
}

func main() {
	f("direct")
	go f("goroutine")

	go func(msg string) {
		fmt.Println(msg)
	}("going")

	time.Sleep(time.Second)
	fmt.Println("done")
}

See: Goroutines, Channels

#协程同步 WaitGroup

package main

import (
	"fmt"
	"sync"
	"time"
)

func w(id int, wg *sync.WaitGroup) {
	defer wg.Done()
	fmt.Printf("%d starting\n", id)

	time.Sleep(time.Second)
	fmt.Printf("%d done\n", id)
}

func main() {
	var wg sync.WaitGroup
	for i := 1; i <= 5; i++ {
		wg.Add(1)
		go w(i, &wg)
	}
	wg.Wait()
}

See: WaitGroup

#关闭通道 (Closing Channels)

ch <- 1
ch <- 2
ch <- 3
close(ch) // Closes a channel

// Iterate the channel until closed
for i := range ch {
  ···
}

// Closed if `ok == false`
v, ok := <- ch

See: Range and close

#有缓冲通道 (Buffered Channels)

ch := make(chan int, 2)
ch <- 1
ch <- 2
ch <- 3
// fatal error:
// all goroutines are asleep - deadlock

See: Buffered channels

#Go 错误与延迟控制

#defer 延迟调用

func main() {
  defer func() {
    fmt.Println("Done")
  }()
  fmt.Println("Working...")
}

#匿名函数 defer 延迟

func main() {
  var d = int64(0)
  defer func(d *int64) {
    fmt.Printf("& %v Unix Sec\n", *d)
  }(&d)
  fmt.Print("Done ")
  d = time.Now().Unix()
}

The defer func uses current value of d, unless we use a pointer to get final value at end of main.

#defer 执行顺序

func main() {
  defer fmt.Println("Done")
  fmt.Println("Working...")
}

See: Defer, panic and recover

#Go 方法 (Methods)

#值/指针接收者 (Receivers)

type Vertex struct {
  X, Y float64
}
func (v Vertex) Abs() float64 {
  return math.Sqrt(v.X * v.X + v.Y * v.Y)
}
v := Vertex{1, 2}
v.Abs()

See: Methods

#修改属性与指针接收者

func (v *Vertex) Scale(f float64) {
  v.X = v.X * f
  v.Y = v.Y * f
}
v := Vertex{6, 12}
v.Scale(0.5)
// `v` is updated

See: Pointer receivers

#Go 接口 (Interfaces)

#基础接口定义 (Basic Interface)

type Shape interface {
  Area() float64
  Perimeter() float64
}

#结构体实现接口 (Struct)

type Rectangle struct {
  Length, Width float64
}

Struct Rectangle implicitly implements interface Shape by implementing all of its methods.

#Matcher 核心方法

func (r Rectangle) Area() float64 {
  return r.Length * r.Width
}

func (r Rectangle) Perimeter() float64 {
  return 2 * (r.Length + r.Width)
}

The methods defined in Shape are implemented in Rectangle.

#接口综合示例

func main() {
  var r Shape = Rectangle{Length: 3, Width: 4}
  fmt.Printf("Type of r: %T, Area: %v, Perimeter: %v.", r, r.Area(), r.Perimeter())
}

#Go 泛型 (Generics)

#泛型示例 1 (Generics Ex1)

// comparable represents types that can be compared.
type comparable interface {
	int | float64 | string
}

// Max returns the maximum of two comparable values.
func Max[T comparable](a, b T) T {
	if a > b {
		return a
	}
	return b
}

func main() {
	// Find the maximum of two integers.
	maxInt := Max(10, 20)
	fmt.Println("Max integer:", maxInt)

	// Find the maximum of two floats.
	maxFloat := Max(3.14, 2.71)
	fmt.Println("Max float:", maxFloat)

	// Find the maximum of two strings.
	maxString := Max("apple", "banana")
	fmt.Println("Max string:", maxString)
}

#泛型示例 2 (Generics Ex2)


// Pair[T, U] represents a generic pair of values.
type Pair[T, U any] struct {
	First  T
	Second U
}

func main() {
	pair := Pair[int, string]{First: 42, Second: "hello"}

	fmt.Println("First:", pair.First)
	fmt.Println("Second:", pair.Second)

	// Print the types of the values in the pair.
	fmt.Println("Type of First:", reflect.TypeOf(pair.First))
	fmt.Println("Type of Second:", reflect.TypeOf(pair.Second))
}

#Go 文件读写 (File I/O)

#读取文件 (Reading File)

Read the contents of a file into memory.

data, err := os.ReadFile("file.txt")
if err != nil {
    log.Fatal(err)
}

#写入文件 (Writing File)

Write data to a file with specific permissions (e.g., 0644 for read-write).

err := os.WriteFile("file.txt", []byte("Hello, Go!"), 0644)

#Go 单元测试 (Testing)

#单元测试示例 (Unit Test)

Unit Test: A basic unit test follows the below naming convention and uses t.Errorf() to report failures.

func TestAdd(t *testing.T) {
    result := add(2, 3)
    if result != 5 {
        t.Errorf("Expected 5, got %d", result)
    }
}

#单元测试示例 (Unit Test)

Benchmark: Benchmark tests measure performance, using b.N to control iterations.

func BenchmarkAdd(b *testing.B) {
    for i := 0; i < b.N; i++ {
        add(1, 2)
    }
}

#Go JSON 处理

#JSON 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 序列化编码 (JSON Encoding)

Convert a Go struct to JSON.

data, _ := json.Marshal(person)

#JSON 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 解析与序列化 (JSON) 反序列化解码 (JSON Decoding)

Parse JSON data into a Go struct.

json.Unmarshal(data, &person)

#Go Web 服务框架

#net/http 标准库

package main

import (
    "fmt"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "Hello from net/http!")
}

func main() {

    http.HandleFunc("/", handler)

    http.ListenAndServe(":8080", nil)
}

#gorilla/mux 路由框架 路由框架 路由框架 路由框架 路由框架 路由框架 路由框架 路由框架 路由框架 路由框架 路由框架 路由框架 路由框架 路由框架 路由框架

package main

import (
    "fmt"
    "net/http"
    "github.com/gorilla/mux"
)

func main() {

    r := mux.NewRouter()

    r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "Hello from Gorilla Mux!")
    })

    http.ListenAndServe(":8081", r)
}

#chi 轻量级路由框架 轻量级路由框架 轻量级路由框架 轻量级路由框架 轻量级路由框架 轻量级路由框架 轻量级路由框架 轻量级路由框架 轻量级路由框架 轻量级路由框架 轻量级路由框架 轻量级路由框架 轻量级路由框架 轻量级路由框架 轻量级路由框架

package main

import (
    "fmt"
    "net/http"
    "github.com/go-chi/chi/v5"
)

func main() {

    r := chi.NewRouter()

    r.Get("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "Hello from Chi!")
    })

    http.ListenAndServe(":8082", r)
}

#Gin 高性能 Web 框架

package main

import (
    "github.com/gin-gonic/gin"
)

func main() {

    r := gin.Default()

    r.GET("/", func(c *gin.Context) {
        c.String(200, "Hello from Gin!")
    })

    r.Run(":8083")
}

#Fiber 极速 Web 框架

package main

import (
    "github.com/gofiber/fiber/v3"
)

func main() {

    app := fiber.New()

    app.Get("/", func(c *fiber.Ctx) error {
        return c.SendString("Hello from Fiber!")
    })

    app.Listen(":8084")
}

#Beego 企业级框架

package main

import (
    "github.com/beego/beego/v2/server/web"
)

func main() {

    web.Get("/", func(ctx *web.Context) {
        ctx.Output.Body([]byte("Hello from Beego!"))
    })

    web.Run()
}

#其他实用技巧 (Miscellaneous)

#Go 关键字保留字 (Keywords)

  • break
  • default
  • func
  • interface
  • select
  • case
  • defer
  • go
  • map
  • struct
  • chan
  • else
  • goto
  • package
  • switch
  • const
  • fallthrough
  • if
  • range
  • type
  • continue
  • for
  • import
  • return
  • var
  • iota

#运算符与标点符号 (Operators)

+ & += &= && == != ( )
- | -= |= || < <= [ ]
* ^ *= ^= <- > >= { }
/ << /= <<= ++ = := , ;
% >> %= >>= -- ! ... . :
&^ &^=

#扩展阅读