3

我目前正在学习如何使用 Go(或 golang)进行开发,但我遇到了一个奇怪的问题:

我尝试创建一个在 HTML 文件中查找的脚本,以便获取每个文件的所有源标签。该脚本的目标是合并所有检索到的文件。

所以,这就是故事:现在,我能够获取每个 JavaScript 文件的内容,但是......我无法连接它们......

你可以在下面看到我的脚本:

//Open main file
mainFilePath := "/path/to/my/file.html"
mainFileDir := path.Dir(mainFilePath)+"/"

mainFileContent, err := ioutil.ReadFile(mainFilePath)

if err == nil {
    mainFileContent := string(mainFileContent)
    var finalFileContent bytes.Buffer

    //Start RegExp searching for JavaScript src
    scriptReg, _ := regexp.Compile("<script src=\"(.*)\">")
    scripts := scriptReg.FindAllStringSubmatch(mainFileContent,-1)

    //For each SRC found...
    for _, path := range scripts {
        //We open the corresponding file
        subFileContent, err := ioutil.ReadFile(mainFileDir+path[1])

        if err == nil {
            //And we add its content to the "final" variable
            fmt.Println(finalFileContent.Write(subFileContent))
        } else {
            fmt.Println(err)
        }
    }

    //Try to display the final result
    // fmt.Println(finalFileContent.String())
    fmt.Printf(">>> %#v", finalFileContent)
    fmt.Println("Y U NO WORKS? :'(")

} else {
    fmt.Println(err)
}

因此,每个都fmt.Println(finalFileContent.Write(subFileContent))显示类似6161的内容,因此我假设Write()方法已正确执行。

fmt.Printf(">>> %#v", finalFileContent)什么也没显示。绝对没有(甚至“>>>”也没有显示!)上面的注释行也是如此。

有趣的是,字符串"YU NO WORK ? :'("正确显示...

你知道为什么吗?你知道如何解决这个问题吗?

提前致谢!

4

1 回答 1

2

你忽略了一些错误。当您运行以下版本的代码时,您的结果是什么?

package main

import (
    "bytes"
    "fmt"
    "io/ioutil"
    "path"
    "regexp"
)

func main() {
    //Open main file
    mainFilePath := "/path/to/my/file.html"
    mainFileDir := path.Dir(mainFilePath) + "/"

    mainFileContent, err := ioutil.ReadFile(mainFilePath)

    if err == nil {
        mainFileContent := string(mainFileContent)
        var finalFileContent bytes.Buffer

        //Start RegExp searching for JavaScript src
        scriptReg, _ := regexp.Compile("<script src=\"(.*)\">")
        scripts := scriptReg.FindAllStringSubmatch(mainFileContent, -1)

        //For each SRC found...
        for _, path := range scripts {
            //We open the corresponding file
            subFileContent, err := ioutil.ReadFile(mainFileDir + path[1])

            if err == nil {
                //And we add its content to the "final" variable

                // fmt.Println(finalFileContent.Write(subFileContent))
                n, err := finalFileContent.Write(subFileContent)
                fmt.Println("finalFileContent Write:", n, err)

            } else {
                fmt.Println(err)
            }
        }

        //Try to display the final result
        // fmt.Println(finalFileContent.String())

        // fmt.Printf(">>> %#v", finalFileContent)
        n, err := fmt.Printf(">>> %#v", finalFileContent)
        fmt.Println()
        fmt.Println("finalFileContent Printf:", n, err)

        fmt.Println("Y U NO WORKS? :'(")

    } else {
        fmt.Println(err)
    }
}

更新:

该声明:

fmt.Println("finalFileContent Printf:", n, err)

输出:

finalFileContent Printf: 0 write /dev/stdout: winapi error #8

或者

finalFileContent Printf: 0 write /dev/stdout: Not enough storage is available to process this command.

来自 MSDN:

ERROR_NOT_ENOUGH_MEMORY

8 (0x8)

没有足够的存储空间来处理此命令。

Windows 控制台的格式化输出溢出缓冲区(大约 64KB)。

有一个相关的 Go open 问题:

问题 3376:windows:在 os.File.Write 中检测 + 处理控制台

于 2012-08-02T23:35:34.113 回答