使用文件方案读取URL作为ReadFile的文件名的惯用方式是什么?

Jon*_*tow 5 go

是否有一种惯用的方式从(文件方案)URL而不是路径开始从系统读取文件?

我首先尝试了这个:

fileUrlStr := "file:///path/to/file.json"
jsonBuffer, _ := ioutil.ReadFile(fileUrlStr)
Run Code Online (Sandbox Code Playgroud)

这是我当前的版本(通常是正常工作的版本),但我担心我缺少一些陷阱,所以我希望有一种更尝试,更真实的方法:

fileUrlStr := "file:///path/to/file.json"
fileUrl, _ := url.Parse(fileUrlStr)
jsonBuffer, _ := ioutil.ReadFile(fileUrl.Path)
Run Code Online (Sandbox Code Playgroud)

(如果我可以同时支持这两种方法file:///Users/jdoe/temp.jsonfile:///c:/WINDOWS/clock.json而不必添加说明它们的代码路径,则有好处)

Liy*_*ang 4

使用net/url,您所使用的解决方案是正确的。

它可以正确处理跨平台的主机名和路径,并且还让您有机会检查 url 方案是文件方案。

package main

import (
    "fmt"
    "net/url"
)

func main() {

    for _, path := range []string{
        "file:///path/to/file.json",
        "file:///c:/WINDOWS/clock.json",
        "file://localhost/path/to/file.json",
        "file://localhost/c:/WINDOWS/clock.avi",

        // A case that you probably don't need to handle given the rarity,
        // but is a known legacy win32 issue when translating \\remotehost\share\dir\file.txt 
        "file:////remotehost/share/dir/file.txt",

    } {
        u, _ := url.ParseRequestURI(path)
        fmt.Printf("url:%v\nscheme:%v host:%v Path:%v\n\n", u, u.Scheme, u.Host, u.Path)
    }
}
Run Code Online (Sandbox Code Playgroud)