30 常用包与命令
[TOC]
常用包与命令
常用命令
代码中使用命令
go generate 注释
go generate 命令是在 Go 1.4 版本新增加的一个命令,当运行该命令将扫描与当前包相关的源代码文件,找出所有包含 //go:generate 的注释,提取并执行该注释后面的命令。
使用 go generate 命令需要注意注释必须在 .go 源码文件中、每个源码文件可以包含多个 generate 注释、运行 go generate 命令才会执行注释后面的命令、go generate 命令执行出错会终止程序的运行、 注释必须以 //go:generate 开头。
go generate 命令的常见使用场景如 gRPC 中从 protocol buffer 定义文件 .proto 编译成 .pb.go 文件、HTML 文件嵌入到 go 源码中、将 JPEG 这类文件转成 go 代码中的字节数组等,在 go-ethereum 中也有用于将 Solidity 智能合约编译成 go 源码。
//go:generate go run ../../cmd/abigen --sol contract/oracle.sol --pkg contract --out contract/oracle.gogo:embed
embed 是在 Go 1.16 中新加包。它通过 //go:embed 指令,可以在编译阶段将静态资源文件打包进编译好的程序中,并提供访问这些文件的能力。
使用 embed 包会让部署过程更简单,传统部署需要将静态资源与已编译程序打包在一起上传,或者使用docker 和 dockerfile 自动化。确保程序的完整性,在运行过程中损坏或丢失静态资源通常会影响程序的正常运行。可以独立控制程序所需的静态资源,最常见的方法(例如静态网站的后端程序)要求将程序连同其所依赖的 html 、css、js 和图片以及静态资源的路径一起上传到生产服务器,配置 Web 服务器用户就可以访问它。将这些静态资源、配置文件都嵌入到程序中,只需要部署一个二进制文件并为程序本身配置它们即可,简化部署过程。
//go:embed 指令只能用在包一级的变量中,不能用在函数或方法级别。当包含目录时,它不会包含以 "." 或 " " 开头的文件,但是如果使用通配符,比如 dir/* ,它将包含所有匹配的文件,即使它们以 "." 或 " " 开头。
在 Web 服务器中嵌入文件但不允许用户查看所有文件的列表的情况下,包含 Mac OS 的 .DS_Store 文件可能是一个安全问题,出于安全原因,Go在嵌入时也不会包含符号链接或上一层目录。
embed 的基本语法
先导入 embed 包,然后使用指令 //go:embed 文件名 将对应的文件或目录结构导入到对应的变量上。 例如: 在当前目录下新建文件 version.txt,并输入内容 0.0.1,这是将静态资源文件嵌入到字符串。
embed 的三种数据类型及使用
在 embed 中,可以将静态资源文件嵌入到字符串、字节数组、embed.FS 文件类型等三种类型的变量。
将文件内容嵌入到字节数组变量中
将文件目录结构映射成 embed.FS 文件类型,embed.FS 结构主要有3个对外方法
搭建一个简单的静态文件web服务为例。
常用包
runtime
runtime/debug
日志 log
Last updated