网络包中的Golang类型

时间:2017-03-06 22:22:03

标签: go

我在golang编写了一些工具来让我的生活更轻松,而且我根本不理解网络包中的类型是如何工作的。这是我的代码的一部分:

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文件,其中包含我程序的所有配置。

当我从命令行读取readGateway变量的IP地址时,它可以存储,这是预期的,但是当我尝试制作时 dataConfig.gateway = net.ParseIP(readGateway) 并且我尝试将字符串对象强制转换为net.IP对象我在nill字段中始终获得dataConfig.gateway,因此我无法使用该DECLARE @StaffName nvarchar(4000) SET @StaffName = 'Select * From table_1 INNER JOIN table_2 ON table_1.A = table_2.B' SELECT SUBSTRING ( @StaffName, CHARINDEX('From', @StaffName), CHARINDEX(' ', SUBSTRING(@StaffName, CHARINDEX(' ', @StaffName), 255)) ) , SUBSTRING(@StaffName, CHARINDEX('From ', @StaffName) + 5, LEN(@StaffName)) , SUBSTRING(@StaffName, CHARINDEX('From ', @StaffName) + 5, LEN(@StaffName)) , RIGHT(@StaffName,LEN(@StaffName)-CHARINDEX('From ',@StaffName)) 字段参数既不会将其转换为字符串。

有人能帮帮我吗? 提前谢谢。

2 个答案:

答案 0 :(得分:1)

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

请在致电net.ParseIP之前记录字符串s,以便检查您是否正在通过并在程序中正确阅读。

答案 1 :(得分: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")