溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

使用golang怎么將文件嵌入到可執(zhí)行程序

發(fā)布時(shí)間:2021-02-20 13:48:01 來源:億速云 閱讀:384 作者:Leah 欄目:開發(fā)技術(shù)

今天就跟大家聊聊有關(guān)使用golang怎么將文件嵌入到可執(zhí)行程序,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

嵌入文件直接訪問

原理是使用go:embed標(biāo)簽來完成。下面是直接讀取文件內(nèi)容,需要注意下面幾點(diǎn)。
文件不是utf8編碼時(shí),輸出內(nèi)容為中文會(huì)亂碼。
測(cè)試過嵌入文件只能為源碼文件同級(jí)目錄和子目錄下的文件,試過其他目錄的絕對(duì)路徑或相對(duì)路徑會(huì)報(bào)錯(cuò)。
我測(cè)試過幾個(gè)能想到的場(chǎng)景,有些會(huì)報(bào)錯(cuò),所以在使用時(shí)需要注意。

package main
 
import (
  _ "embed"
)
 
//go:embed test.txt
var testString string // 當(dāng)前目錄,解析為string類型
 
//go:embed test.txt
var testByte []byte // 當(dāng)前目錄,解析為[]byte類型
 
//go:embed test/test.txt
var testAbsolutePath string // 子目錄,解析為string類型
 
//go:embed notExistsFile
var testErr0 string // 文件不存在,編譯報(bào)錯(cuò):pattern notExistsFile: no matching files found
 
//go:embed dir
var testErr1 string // dir是目錄,編譯報(bào)錯(cuò):pattern dir: cannot embed directory dir: contains no embeddable files
 
//go:embed ../test.txt
var testErr2 string // 相對(duì)路徑,不是當(dāng)前目錄或子目錄,編譯報(bào)錯(cuò):pattern ../test.txt: invalid pattern syntax
 
//go:embed D:\test.txt
var testErr3 string // 絕對(duì)路徑,編譯報(bào)錯(cuò):pattern D:\test.txt: no matching files found
 
func main() {
  println(testString)
  println(string(testByte))
  println(testAbsolutePath)
}

嵌入文件列表

package main
 
import (
  "embed"
  "io"
  "os"
)
 
//go:embed test0.txt test1.txt test1*.txt
//go:embed test/test0.txt test/test1.txt
//go:embed test0
var fileList embed.FS
/*
使用上述方法可以將多個(gè)文件或目錄添加到fileList中。
1. 添加多個(gè)文件,且支持"*"號(hào)通配文件。
2. 支持子目錄文件。
3. 支持嵌入一個(gè)目錄。
*/
 
func main() {
  testDir, err := fileList.ReadDir("test0")
  if err != nil {
    panic(err)
  }
  for _, v := range testDir {
    println(v.Name()) // 打印嵌入的目錄內(nèi)容
  }
 
  // 使用fileList.Open可以生成一個(gè)對(duì)象,可以通過文件流那樣讀出來
  testFile, err := fileList.Open("test0.txt")
  if err != nil {
    panic(err)
  }
  io.Copy(os.Stdout, testFile)
 
  testFile, err = fileList.Open("test112.txt")
  if err != nil {
    panic(err)
  }
  io.Copy(os.Stdout, testFile)
 
  testFile, err = fileList.Open("test/test1.txt")
  if err != nil {
    panic(err)
  }
  io.Copy(os.Stdout, testFile)
 
  // 直接將文件內(nèi)容讀出來
  data, err := fileList.ReadFile("test111.txt")
  if err != nil {
    panic(err)
  }
  println(string(data))
}

看完上述內(nèi)容,你們對(duì)使用golang怎么將文件嵌入到可執(zhí)行程序有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI