【问题标题】:Go : How to read the contents of two files and concatenate to a stringGo:如何读取两个文件的内容并连接到一个字符串
【发布时间】:2016-01-08 18:00:44
【问题描述】:

我正在尝试修复 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 的知识,并回馈我能解决的任何问题。

有什么想法吗?

【问题讨论】:

    标签: arrays go io deferred docker-machine


    【解决方案1】:

    在示例代码中,他们首先使用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
    

    【讨论】:

      猜你喜欢
      • 2022-01-03
      • 2022-06-29
      • 2017-09-13
      • 1970-01-01
      • 2020-03-18
      • 2019-11-02
      • 2020-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多