【问题标题】:Golang types in net package网络包中的 Golang 类型
【发布时间】:2017-03-07 07:21:34
【问题描述】:

我正在用 golang 编写一些工具来让我的生活更轻松,但我完全不了解 net 包中的类型是如何工作的。这是我的代码的一部分:

import (
    "bufio"
    "fmt"
    "log"
    "net"
    "os"
)


type configFile struct {
    gateway, net             net.IP
    mask, port               int
    telnetUser, telnetPasswd string
}

var dataConfig configFile

func createConfigFile() {
    reader := bufio.NewReader(os.Stdin)    
    fmt.Println("Let's fill te config file for the application.")
    fmt.Println("Which is your gateway IP?")
    readGateway, err := reader.ReadString('\n')
    if err != nil {
        log.Fatal(err)
    }

    dataConfig.gateway = net.ParseIP(readGateway)

    if dataConfig.gateway == nil {
        log.Fatal("Problem here")
    } else {
        fmt.Println("Your gateway is: ", dataConfig.gateway.String())
    }

}

我的问题是下一个:

我想从命令行读取一个 IP 地址并将其存储在 configFile 对象中,稍后我将使用该对象创建一个包含我程序的所有配置的 .json 文件。

当我从命令行读取 IP 地址时,readGateway 变量存储它没问题,这是意料之中的,但是当我尝试制作时 dataConfig.gateway = net.ParseIP(readGateway) 我尝试将字符串对象转换为net.IP 对象我总是在dataConfig.gateway 字段中得到nill,因此我无法使用该参数,也无法将其转换为字符串。

有人可以帮我吗? 提前致谢。

【问题讨论】:

  • 如何将IP字符串传递给程序?你能粘贴你的 main() 函数吗?
  • 主函数只调用了createConfigFile()。我正在从标准输入读取 if。

标签: go


【解决方案1】:

bufio.Reader.ReadString 的文档解释(重点是我的)

ReadString 读取直到输入中第一次出现 delim, 返回一个包含数据直到并包括 分隔符

所以readGateway 最终看起来像"192.168.1.1\n"。您的换行符分隔符不会存在于格式正确的 IP 地址中,这意味着当您使用 net.ParseIP 解析它时,它会将其踢出为 nil

您可以使用strings.TrimRight 修剪换行符:

readGateway, err := reader.ReadString('\n')
if err != nil {
    log.Fatal(err)
}
readGateway = strings.TrimRight(readGateway, "\n")

【讨论】:

  • 似乎是 TrimRight 没有删除字符串的/n但是我已经尝试像readGateway = readGateway[0:11] 那样调整 readGateway 的大小,现在它正在工作,所以这是一大步。非常感谢。我要看看 TrimRight 的文档,看看发生了什么。
  • 只要你的网关不是 192.168.1.10 并且它的长度应该是 13! ;)。最好的猜测是你有\r\n结束字符串,而不是\n(unix风格的结尾,不是windows),但是如果你没有进行任何类型的故障排除,那么为你调试它真的不值得。祝你好运!
  • @DavidBarranco 我回滚了您的编辑,因为它没有澄清问题。
【解决方案2】:

net.ParseIP(s string) 的文档指出,如果提供的字符串 s 不是 IP 地址的有效文本表示,则该函数将返回 nil 值,因此必须如此。

请在调用net.ParseIP之前记录字符串s,以便您可以检查您是否在程序中正确传递和读取它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 2019-10-23
    • 2020-10-22
    相关资源
    最近更新 更多