doupao1530 2013-12-28 14:00
浏览 144
已采纳

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

I always wished it was possible to do something like this in C++:

const std::string fragmentShader = "
#include "shader.frag"
";

Obviously that doesn't work, and there is no way to do it in C++. But it is possible in go? i.e.

const fragmentShader string = `
<insert contents of shader.frag at compile-time>
`

The motivation should be obvious!

  • 写回答

2条回答 默认 最新

  • donglu3087 2013-12-28 16:20
    关注

    This is not possible in pure Go. You could however write a program that reads a file and creates a Go file from it, such as this:

    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
    
    var %s = [...]byte{
    "
        trailer = "}
    "
    )
    
    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
    ", *outFile, err)
                os.Exit(1)
            }
        }
    
        inF, err := os.Open(flag.Args()[0])
        if err != nil {
            fmt.Fprintf(os.Stderr, "Cannot open %s: %v
    ", 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,
    ", buf[n-1])
        }
    
        out.WriteString(trailer)
    
        out.Flush()
    
        if err != io.EOF {
            fmt.Fprintf(os.Stderr, "An error occured while reading from %s: %v
    ", flag.Args()[0], err)
            os.Exit(1)
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗
  • ¥15 钢筋实图交点识别,机器视觉代码
  • ¥15 如何在Linux系统中,但是在window系统上idea里面可以正常运行?(相关搜索:jar包)
  • ¥50 400g qsfp 光模块iphy方案
  • ¥15 两块ADC0804用proteus仿真时,出现异常