我正在尝试修复 docker-machine 中的错误。问题似乎出在 vmware-fusion 驱动程序上。当尝试通过 MAC 地址解析计算机时,它会查阅 vmware dhcp 租用文件。不幸的是,当您使用自定义网络(例如专用网络 vmnet2)时,最新的 dhcp 租约将位于文件“vmnet-dhcpd-vmnet2.leases”中。
不管怎样,我对围棋的了解是不存在的。
我想实现类似(伪代码)的东西:
var allText = ""
for i in "/var/db/vmware/*.leases"
do read i; allText = allText ++ i
done
现有代码(fusion_darwin.go)看起来像这样:
// DHCP lease table for NAT vmnet interface
var dhcpfile = "/var/db/vmware/vmnet-dhcpd-vmnet8.leases"
if vmxfh, err = os.Open(d.vmxPath()); err != nil {
return "", err
}
defer vmxfh.Close()
if vmxcontent, err = ioutil.ReadAll(vmxfh); err != nil {
return "", err
}
我已经创建了一个问题等,但如果可能的话,我想进一步了解更多关于 Go 的知识,并贡献我能解决的任何问题。
有什么想法吗?
在示例代码中,他们首先使用
os.Open
返回文件的 io.Reader
,然后延迟关闭(在离开延迟范围之前调用延迟方法)以确保清理其资源。在下一行中,他们调用 ioutil.ReadAll
,它接受 io.Reader
并返回 []byte, error
。如果错误非零,他们只会返回错误和一个空字符串。要从 []byte 中获取字符串,您只需执行 s := string(myBytes)
。
因此,要读取目标文件,您只需复制上面代码的形式即可。更好的是,您可以将其移动到一个方法中并将文件路径传递给它,以便您可以重用它。值得注意的是,
ioutil
包中有一种更简单的方法可以使用。我不确定上面的代码中没有使用它是否有充分的理由,而不是打开文件并将 io.Reader
传递给 ReadAll
你可以直接调用 ioutil.ReadFile
传递路径,它也返回一个 []byte, error
,检查错误后,您可以将一个字节切片附加到另一个字节切片,转换为字符串并返回它。它看起来有点像这样;
vmnetcontent, err := ioutil.ReadFile("/path/to/file.txt")
if err != nil {
return "", err
}
return string(append(vmxcontent, vmnetcontent)), nil