首页 > 其他分享 >go语言的嵌入功能 ebmed

go语言的嵌入功能 ebmed

时间:2024-10-18 10:48:07浏览次数:7  
标签:嵌入 string err fmt ebmed go embed

我们都知道,go编译的程序非常适合部署

我们一般编译出来的可执行二进制文件都是单个的文件,非常适合复制和部署

还能通过交叉编译在windows上开发编译到linux平台使用

简直不要太爽

但是我们在项目中可能还会用到静态文件,这些是不会编译到二进制程序中去的

例如项目的配置文件

例如项目运行中需要读取的文件

如果这些文件也可以被打包到二进制文件里面,那就太美妙了,编译之后直接一个可执行文件即可搞定

嵌入

  • 对于单个的文件,支持嵌入为字符串和 byte slice
  • 对于多个文件和文件夹,支持嵌入为新的文件系统FS
  • 比如导入 "embed"包,即使无显式的使用
  • go:embed指令用来嵌入,必须紧跟着嵌入后的变量名
  • 只支持嵌入为string, byte slice和embed.FS三种类型,这三种类型的别名(alias)和命名类型(如type S string)都不可以

嵌入字符串

package main

import (
  _ "embed"
  "fmt"
)

//go:embed hello.txt
var data string

func main() {
  fmt.Println(data)
}

嵌入byte slice

package main

import (
  _ "embed"
  "fmt"
)

//go:embed hello.txt
var data []byte

func main() {
  fmt.Println(string(data))
}

嵌入embed.FS

嵌入单个文件

package main

import (
  "embed"
  _ "embed"
  "fmt"
)

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

func main() {
  byteData, err := fs.ReadFile("hello.txt")
  fmt.Println(string(byteData), err)
}


嵌入多个文件

package main

import (
  "embed"
  _ "embed"
  "fmt"
)

//go:embed hello.txt jwt.go
var fs embed.FS

func main() {
  byteData, err := fs.ReadFile("hello.txt")
  fmt.Println(string(byteData), err)
  byteData, err = fs.ReadFile("jwt.go")
  fmt.Println(string(byteData), err)
}

嵌入一个目录

package main

import (
  "embed"
  _ "embed"
  "fmt"
  "path"
)

//go:embed proxy
var fs embed.FS

func main() {
  dir, err := fs.ReadDir("proxy")
  if err != nil {
    fmt.Println(err)
    return
  }
  for _, entry := range dir {
    info, _ := entry.Info()
    fmt.Println(info.Name())
    if info.IsDir() {
      subDir, _ := fs.ReadDir(path.Join("proxy", info.Name()))
      for _, subEntry := range subDir {
        subInfo, _ := subEntry.Info()
        fmt.Printf("  -%s\n", subInfo.Name())
      }
    }
  }
}

注意:go:embed只能用于包级别声明的变量,在函数里面是不能用的

实际应用

有些场合,我们在程序里面会读取一些静态文件,这些静态文件开发好之后就八辈子不会再变了

并且文件也不大

不把它编译到程序里面,到时候部署还得把这个文件移过去移过来,麻烦

例如我的项目,我单独把es的索引写在了json文件里面

func (CdnLogModelEs) Mapping() string {
  byteData, err := os.ReadFile("models/cdn_log_model_mapping.json")
  if err != nil {
    logrus.Error(err)
    panic(err)
    return ""
  return string(byteData)
}

这是之前的写法,只要服务器上要重建索引的适合,必须要把这个json文件给带上去,还是很麻烦的

所以现在的写法就很方便了

//go:embed cdn_log_model_mapping.json
var cdnLogModelMapping string

func (CdnLogModelEs) Mapping() string {
  return cdnLogModelMapping
}

不适合嵌入

  1. 大文件
  2. 经常变化的文件(例如配置文件)

参考文档

embed简明教程 Go embed 简明教程-CSDN博客

标签:嵌入,string,err,fmt,ebmed,go,embed
From: https://blog.csdn.net/csdngzy/article/details/143038944

相关文章

  • 基于django+vue+Vue基于Web的美食分享平台管理系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着互联网的迅猛发展,美食文化在全球范围内得到了广泛的传播和分享。关于美食分享平台的研究,现有研究主要以社交媒体和在线评论系统为主,这......
  • 基于django+vue+Vue基于web的茂名论坛设计与实现【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着互联网技术的飞速发展,网络论坛作为信息交流的重要平台,在促进社会互动、信息传播和舆论形成方面发挥着越来越重要的作用。茂名作为广东......
  • 基于django+vue+Vue基于Web的美术作品大赛管理系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着文化艺术事业的蓬勃发展,美术作品大赛已成为展示艺术才华、促进文化交流的重要平台。然而,当前大多数美术作品大赛的管理仍依赖于传统的......
  • 基于django+vue+Vue基于Web的美食分享平台管理系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容美食分享平台管理系统相关内容说明一、选题背景关于美食分享平台管理系统的研究,现有研究主要以美食分享平台的用户体验或功能实现为主,专门针对美......
  • 基于django+vue+Vue基于web的茂名论坛设计与实现【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于论坛系统的研究,现有研究多集中在大型综合论坛或特定领域的专业论坛,如技术论坛、商业论坛等。在国内外,对于针对特定地区的地方论坛......
  • Google Tx-LLM:用大型语言模型助力治疗药物开发
      每周跟踪AI热点新闻动向和震撼发展想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领域的领跑者。点击订阅,与未来同行!订阅:https://......
  • goldwave 循环播放
    首先得在选项控制属性里边,或者右键这里选择前奏/循环/结尾或者循环点或者循环关于具体是什么意思,参考https://www.goldwavechina.cn/bianji/boi-fa01.html 这里有一些难以理解 9.前奏/循环/结尾这是一种特殊的播放功能,可以分三个部分播放声音。首先,播放选......
  • 使用 Go 构建一个最小的 API 应用
    最近有项目要使用Go开发,作为一个.NETCore选手,准备先撸一个包含CRUD的最小MVP项目练手。要创建一个TODO应用,会创建下面这些接口:APIDescriptionRequestbodyResponsebodyGET/todoitemsGetallto-doitemsNoneArrayofto-doitemsGET/todoitems/c......
  • 【Golang】踩坑记录:make()创建引用类型,初始值是不是nil!!
    文章目录起因二、得记住的知识点1.make()切片,初始化了吗?2.make()切片不同长度容量,append时的差别3.切片是指向数组的指针吗?4.切片扩容时,重新分配内存,原切片的数据怎么办?三、咳咳,总结一下起因序列化的时候居然给我空指针报错,哪nil啦???猛一顿查,查到了创建的结构体......
  • EF4323 Algorithmic Trading
    EF4323AlgorithmicTradingProjectSemesterA2024/2025Instructor:Dr.DU,JintaoIntroductionInthisproject,wesimulatethealgorithmictradingbusinessmodel,whereasmallgroupofproprietarytraderstriestoattractoutsideinstitutionalinvest......