我正在尝试修复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。如果错误不是nil,则返回错误和一个空字符串。要从[] byte中获取字符串,您可以执行s := string(myBytes)

因此,要读取目标文件,您可以只复制上面代码的形式。更好的是,您可以将其移动到方法中并将文件路径传递给它,以便您可以重用它。值得注意的是,在ioutil包中有一种更容易使用的方法。我不确定上面的代码中没有使用它是有充分的理由的,但是您无需打开文件并将io.Reader传递给ReadAll,您可以调用ioutil.ReadFile并将其传递给路径,并在检查后返回[]byte, error对于错误,您可以将一个 byte slice 附加到另一个 byte slice ,转换为字符串并返回它。看起来有点像这样;

vmnetcontent, err := ioutil.ReadFile("/path/to/file.txt")

if err != nil {
    return "", err
}

return string(append(vmxcontent, vmnetcontent)), nil

09-25 16:35
查看更多