前言

embed//go:embed

Go 1.16 还添加了 macOS ARM64 的支持(也称为 Apple silicon)。对于苹果新发布的 M1 芯片的 Mac 感兴趣的读者,可以放心购买了。

请注意,Go 1.16 默认需要使用 Go Modules,现在,根据 Go 官方的 2020 Go 开发人员调查,96% 的 Go 开发人员已经切换到了 Go Modules。

Go 1.16 还有许多其他改进和错误修复,包括编译速度提升高达 25% 且内存减少 15%。

embed

更新历史

2021 年 02月 18日 - 初稿


//go:embed
//go:embedembed_embed
io/fsnet/httptext\templatehtml\template

字符串类型模式示例代码:

1
2
//go:embed hello.txt
var s string

字节类型切片模式示例代码:

1
2
//go:embed hello.txt
var b []byte

FS 类型模式示例代码:

1
2
//go:embed hello.txt
var f embed.FS
//go:embed
//
//go:embed
//go:embed
//go:embed//go:embed...*.
//go:embed
//go:embed//go:embed

FS 是只读值,因此, 可以安全地同时从多个 go 协程使用, 并且安全地将 FS 类型的值分配给对方。

1
2
3
type FS struct {
// contains filtered or unexported fields
}

FS 类型包含三个方法,分别是 Open,ReadDir 和 ReadFile。

  • func (f FS) Open(name string) (fs.File, error) 打开要读取的命名文件,并作为 fs.File 返回它。
  • func (f FS) ReadDir(name string) ([]fs.DirEntry, error) 读取并返回整个命名目录。
  • func (f FS) ReadFile(name string) ([]byte, error) 读取并返回命名文件的内容。

ReadFile 方法的示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main

import (
"embed"
"fmt"
)

//go:embed hello.txt
var f embed.FS

func main () {
bs, err := f.ReadFile("hello.txt")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(bs)
}

总结

embed//go:embedembed//go:embed
embed/usr/local/go/src/embed/embed.go