我在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))
字段参数既不会将其转换为字符串。
有人能帮帮我吗? 提前谢谢。
答案 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")