为了账号安全,请及时绑定邮箱和手机立即绑定

是否可以将外部文件作为字符串常量包含在 go 中?

是否可以将外部文件作为字符串常量包含在 go 中?

Go
慕的地10843 2021-06-29 13:02:58
我一直希望可以在 C++ 中做这样的事情:const std::string fragmentShader = "#include "shader.frag"";显然这行不通,而且在 C++ 中没有办法做到这一点。但是在 go 中有可能吗?IEconst fragmentShader string = `<insert contents of shader.frag at compile-time>`动机应该很明显!
查看完整描述

2 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

这在纯 Go 中是不可能的。但是,您可以编写一个程序来读取文件并从中创建一个 Go 文件,例如:


package main


import "flag"

import "os"

import "fmt"

import "bufio"

import "io"


var (

    packageName = flag.String("p", "main", "package name")

    outFile     = flag.String("o", "-", "output file. Defaults to stdout")

    varName     = flag.String("v", "file", "variable name")

)


const (

    header  = "package %s\n\nvar %s = [...]byte{\n"

    trailer = "}\n"

)


func main() {


    flag.Parse()


    if len(flag.Args()) != 1 {

        fmt.Fprintln(os.Stderr, "Please provide exactly one file name")

        os.Exit(1)

    }


    var inF, outF *os.File


    if *outFile == "-" {

        outF = os.Stdout

    } else {

        var err error

        outF, err = os.Create(*outFile)

        if err != nil {

            fmt.Fprintf(os.Stderr, "Cannot create %s: %v\n", *outFile, err)

            os.Exit(1)

        }

    }


    inF, err := os.Open(flag.Args()[0])

    if err != nil {

        fmt.Fprintf(os.Stderr, "Cannot open %s: %v\n", flag.Args()[0], err)

        os.Exit(1)

    }


    in, out := bufio.NewReader(inF), bufio.NewWriter(outF)


    fmt.Fprintf(out, header, *packageName, *varName)


    buf := make([]byte, 16)


    var n int


    for n, err = io.ReadFull(in, buf); n > 0; n, err = io.ReadFull(in, buf) {

        out.WriteRune('\t')


        for i := 0; i < n-1; i++ {

            fmt.Fprintf(out, "%#02x, ", buf[i])

        }


        fmt.Fprintf(out, "%#02x,\n", buf[n-1])

    }


    out.WriteString(trailer)


    out.Flush()


    if err != io.EOF {

        fmt.Fprintf(os.Stderr, "An error occured while reading from %s: %v\n", flag.Args()[0], err)

        os.Exit(1)

    }

}


查看完整回答
反对 回复 2021-07-12
  • 2 回答
  • 0 关注
  • 234 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信