我在Golang中遇到一些字符串问题。似乎他们没有被移交给另一个职能部门。
func Sendtext(ip string, port string, text string) (err int) {
targ := ip + ":" + port
raddr,e := net.ResolveTCPAddr("tcp",targ)
if e != nil {
os.Stdout.WriteString(e.String()+"\n")
return 1
}
conn,e := net.DialTCP("tcp",nil,raddr)
if e != nil {
os.Stdout.WriteString(e.String()+"\n")
return 1
}
conn.Write([]byte(text))
mess := make([]byte,1024)
conn.Read(mess)
message := string(mess)
conn.Close()
if message[0] == 'a' {
return 0
} else {
return 1
}
return 0
}
func main() {
os.Stdout.WriteString("Will send URL: ")
url := GetURL()
os.Stdout.WriteString(url + "\n\n")
_, port, pass, ip := browserbridge_config.ReadPropertiesFile()
os.Stdout.WriteString("sending this url to " + ip + ":" + port + "\n")
message := url + "\n" + pass + "\n"
os.Stdout.WriteString("\nsending... ")
e := Sendtext(ip, port, message)
if e != 0 {
os.Stdout.WriteString("ERROR\n")
os.Exit(e);
}
os.Stdout.WriteString("DONE\n")
}
和我的配置阅读器:
func ReadConfigFile(filename string) (browsercommand string, port string, pass string, ip string) {
// set defaults
browsercommand = "%u"
port = "7896"
pass = "hallo"
ip = "127.0.0.1"
// open file
file, err := os.Open(filename)
if err != nil {
os.Stdout.WriteString("Error opening config file. proceeding with standard config...")
return
}
// Get reader and buffer
reader := bufio.NewReader(file)
for {
part,_,err := reader.ReadLine()
if err != nil {
break
}
buffer := bytes.NewBuffer(make([]byte,2048))
buffer.Write(part)
s := strings.ToLower(buffer.String())
if strings.Contains(s,"browsercommand=") {
browsercommand = strings.Replace(s,"browsercommand=","",1)
} else {
if strings.Contains(s,"port=") {
port = strings.Replace(s,"port=","",1)
} else {
if strings.Contains(s,"password=") {
pass = strings.Replace(s,"password=","",1)
} else {
if strings.Contains(s,"ip=") {
ip = strings.Replace(s,"ip=","",1)
}
}
}
}
}
return
}
该计划的输出:
Will send URL: test.de
sending this url to 192.168.2.100:7896
sending...
dial tcp 192.168.2.1:0: connection refused
ERROR
(192.168.2.1是网关)
我在Sendtext的顶部尝试了os.Stdout.WriteString(targ)或os.Stdout.WriteString(ip),但没有输出。
关于它的令人困惑的事情:昨天它工作了xD(在我将ReadConfig迁移到它自己的.go文件之前)
我希望你能帮我解决这个问题......
塞勒
更新
正如PeterSO所说,问题不在于字符串的移交 我的第一个猜测,它必须是String转换为TCPAddr,是真的,但它似乎是字符串的问题,而不是网络库。 我刚才补充道 ip =“192.168.2.100” port =“7896” 在Sendtext调用之后,这有助于...(至少在用户需要设置自定义IP /端口之前......)
我知道当我决定从goconf(http://code.google.com/p/goconf/)切换到我自己的问题时,问题就出现了。这就是我认为问题出在ReadProperties()函数中的原因。
我也意识到strconv.Atoi(port)返回0(解析“7896”:无效参数) 当我使用服务器和客户端实现(不可更改)配置,然后让客户端从配置文件中读取密码时,密码比较失败。当我在代码中设置密码时(不读取文件),它可以工作。
我真的不知道现在该做什么......有什么想法吗?
答案 0 :(得分:4)
Go bytes package:func NewBuffer(buf []byte) *Buffer
NewBuffer
使用Buffer
创建并初始化新的buf
初始内容。它旨在准备一个Buffer
来阅读 现有数据。它还可用于调整内部缓冲区的大小 写作。要做到这一点,buf
应具有所需的容量,但a 长度为零。在大多数情况下,
new(Buffer)
(或仅声明Buffer
变量) 优于NewBuffer
。特别是,传递一个非空的buf 到NewBuffer
然后写入Buffer
将覆盖buf
, 不附加。
在ReadConfigFile
函数中,您写道:
buffer := bytes.NewBuffer(make([]byte,2048))
buffer.Write(part)
make([]byte,2048)
函数调用为buffer
创建一个初始切片,其长度和容量为2048字节。 buffer.Write(part)
函数调用通过覆盖part
来写buffer
。至少,您应该编写make([]byte,0,2048)
来初始为buffer
切片提供零长度和2048字节的容量。
您的ReadConfigFile
功能还有其他缺陷。例如,key = value格式非常严格,只识别硬编码到函数中的密钥,如果没有给出配置文件,则不返回默认值,配置文件没有关闭等等。这里是一个基本的实现配置文件阅读器。
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
type Config map[string]string
func ReadConfig(filename string) (Config, os.Error) {
config := Config{
"browsercommand": "%u",
"port": "7896",
"password": "hallo",
"ip": "127.0.0.1",
}
if len(filename) == 0 {
return config, nil
}
file, err := os.Open(filename)
if err != nil {
return nil, err
}
defer file.Close()
rdr := bufio.NewReader(file)
for {
line, err := rdr.ReadString('\n')
if eq := strings.Index(line, "="); eq >= 0 {
if key := strings.TrimSpace(line[:eq]); len(key) > 0 {
value := ""
if len(line) > eq {
value = strings.TrimSpace(line[eq+1:])
}
config[key] = value
}
}
if err == os.EOF {
break
}
if err != nil {
return nil, err
}
}
return config, nil
}
func main() {
config, err := ReadConfig(`netconfig.txt`)
if err != nil {
fmt.Println(err)
}
fmt.Println("config:", config)
ip := config["ip"]
pass := config["password"]
port := config["port"]
fmt.Println("values:", ip, port, pass)
}
输入:
[a section]
key=value
; a comment
port = 80
password = hello
ip= 217.110.104.156
# another comment
url =test.de
file =
输出:
config: map[browsercommand:%u key:value port:80 ip:217.110.104.156 url:test.de
file: password:hello]
values: 217.110.104.156 80 hello
答案 1 :(得分:0)
在Sendtext
函数调用main
函数之前插入以下语句作为语句。
fmt.Println("\nmain:", "\nip = |", ip, "| \nport = |", port, "| \ntext = |", message, "|")
输出应该如下所示:
main:
ip = | 192.168.2.100 |
port = | 7896 |
text = | test.de
hallo
|
将以下语句作为Sendtext
函数中的第一个语句插入。
fmt.Println("\nSendtext:", "\nip = |", ip, "| \nport = |", port, "| \ntext = |", text, "|")
输出应该如下所示:
Sendtext:
ip = | 192.168.2.100 |
port = | 7896 |
text = | test.de
hallo
|
正如所料,参数按值传递给参数。
答案 2 :(得分:0)
解决了它。问题是将2048长[]字节转换为字符串。这使得字符串长度相等,但之后有很多NIL字符。
因此,在ReadConfig()末尾的所有值上运行ip = strings.Replace(ip,string(0),"",-1)
解决了问题。