是否有一种惯用的方式从(文件方案)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.json,file:///c:/WINDOWS/clock.json而不必添加说明它们的代码路径,则有好处)
使用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)