上卷 程序设计
中卷 标准库
- bufio 1.18
- bytes 1.18
- io 1.18
- container 1.18
- encoding 1.18
- crypto 1.18
- hash 1.18
- index 1.18
- sort 1.18
- context 1.18
- database 1.18
- connection
- query
- queryrow
- exec
- prepare
- transaction
- scan & null
- context
- tcp
- udp
- http
- server
- handler
- client
- h2、tls
- url
- rpc
- exec
- signal
- embed 1.18
- plugin 1.18
- reflect 1.18
- runtime 1.18
- KeepAlived
- ReadMemStats
- SetFinalizer
- Stack
- sync 1.18
- atomic
- mutex
- rwmutex
- waitgroup
- cond
- once
- map
- pool
- copycheck
- nocopy
- unsafe 1.18
- fmt 1.18
- log 1.18
- math 1.18
- time 1.18
- timer
下卷 运行时
源码剖析
- 1. 初始化
- 2. 内存分配
- 3. 垃圾回收
- 4. 并发调度
- 5. 通道
- 6. 延迟调用
- 7. 终结器
- 8. 其他
附录
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
embed 1.18
将文件嵌入到二进制可执行文件内。
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
、[]byte
、embed.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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论