返回介绍

上卷 程序设计

中卷 标准库

下卷 运行时

源码剖析

附录

embed 1.18

发布于 2024-10-12 19:15:53 字数 2697 浏览 0 评论 0 收藏 0

将文件嵌入到二进制可执行文件内。

package main

import (
    _ "embed"     // 必须 !!!!
)

//go:embed main.go
var main_go string

//go:embed main_test.go
var test_go []byte

func main() {
}

如果使用 embed.FS ,可嵌入更多文件(包目录及其子目录)。

package main

import (
	"embed"
	"fmt"
)

//go:embed mylib/* mylib2/*
//go:embed *.go
var dir embed.FS

func main() {
	fmt.Println(dir.ReadFile("main.go"))
	fmt.Println(dir.ReadFile("mylib2/add.go"))
}
  • //go:embed 指令和变量之间只能有空行或注释。
  • 变量必须是: string[]byteembed.FS
  • 路径不能使用 ./../ ,开头和结尾不能用 /
  • 用引号包含有空格的路径名。( "a b c.txt"
  • 只有 embed.FS 允许多个文件。
  • 可以有多个 //go:embed 指令。
  • 单指令以空格分隔多个路径。( //go:embed a.txt data/*
  • * 表示多文件模糊匹配。

实现

package main

import (
	_ "embed"
)

//go:embed main.go
var main_go string

func main() {
	println(main_go)
}
"".main STEXT size=72 args=0x0 locals=0x18 funcid=0x0 align=0x0
	0x0014  CALL	runtime.printlock(SB)
                                             // StringHeader {
	0x0019  MOVQ	"".main_go(SB), AX       //    data gostring.208...
	0x0020  MOVQ	"".main_go+8(SB), BX     //    len  0xd0
                                             // }
	0x0027  CALL	runtime.printstring(SB)
	0x002c  CALL	runtime.printnl(SB)
	0x0031  CALL	runtime.printunlock(SB)

"".main_go SDATA size=16
	0x0000 00 00 00 00 00 00 00 00 d0 00 00 00 00 00 00 00  ................
	rel 0+8 t=1 go.string..gostring.208.eff...46d+0

go.string..gostring.208.eff...46d SRODATA dupok size=208
	0x0000 70 61 63 6b 61 67 65 20 6d 61 69 6e 0a 0a 69 6d  package main..im
	0x0010 70 6f 72 74 20 28 0a 09 2f 2f 20 22 66 6d 74 22  port (..// "fmt"
	0x0020 0a 09 2f 2f 20 22 69 6f 22 0a 09 2f 2f 20 22 69  ..// "io"..// "i
	0x0030 6f 2f 66 73 22 0a 09 2f 2f 20 22 6c 6f 67 22 0a  o/fs"..// "log".
	0x0040 09 2f 2f 20 22 72 65 66 6c 65 63 74 22 0a 09 2f  .// "reflect"../
	0x0050 2f 20 22 6f 73 22 0a 0a 09 5f 20 22 65 6d 62 65  / "os"..._ "embe
	0x0060 64 22 0a 0a 09 2f 2f 20 22 67 69 74 68 75 62 2e  d"...// "github.
	0x0070 63 6f 6d 2f 71 79 75 68 65 6e 2f 6d 79 6c 69 62  com/qyuhen/mylib
	0x0080 22 0a 29 0a 0a 2f 2f 67 6f 3a 65 6d 62 65 64 20  ".)..//go:embed 
	0x0090 6d 61 69 6e 2e 67 6f 0a 76 61 72 20 6d 61 69 6e  main.go.var main
	0x00a0 5f 67 6f 20 73 74 72 69 6e 67 0a 0a 66 75 6e 63  _go string..func
	0x00b0 20 6d 61 69 6e 28 29 20 7b 0a 09 70 72 69 6e 74   main() {..print
	0x00c0 6c 6e 28 6d 61 69 6e 5f 67 6f 29 0a 7d 0a 0a 0a  ln(main_go).}...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文