我正在尝试我的第一个程序,这应该是一个非常简单的IRC机器人。
我已经完成了部分连接等但是我对结构和指针很困惑。结构对我来说是新的,来自使用类的语言。
我有这个结构和它的构造函数:
type Bot struct {
server string
port string
nick string
channel string
pass string
conn net.Conn
}
// NewBot main config
func NewBot() *Bot {
return &Bot{
server: "irc.twitch.tv",
port: "6667",
nick: "username",
channel: "#channel",
pass: "password123",
conn: nil,
}
}
我的connect()方法如下所示
func (bot *Bot) Connect() (conn net.Conn, err error) {
ircbot := NewBot()
conn, err = net.Dial("tcp", bot.server+":"+bot.port)
// irc connection...
return bot.conn, nil
}
所有这一切都很好用我遇到的问题是我的结构名为Message的另一种方法。它只是应该发送一条消息。看起来像这样:
// Message to send a message
func (bot *Bot) Message(message string) {
if message == "" {
return
}
fmt.Printf("Bot: " + message + "\n")
fmt.Fprintf(bot.conn, "PRIVMSG "+bot.channel+" :"+message+"\r\n")
}
每次当我尝试使用此功能时,我都会收到此错误并且程序崩溃
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x20 pc=0x463d73]
我不确定如何使用&和*正确地签署以实现我想要做的事情。
我认为goroutine是用于多线程的东西,并且通过说“go [做某事]”来完成,但我不会在任何地方使用它。
编辑: 的解决方案
谢谢,我找到了解决方案!对于有兴趣的人: 我在我调用Message()函数的地方创建了一个新的Bot实例,它导致了一个空的conn。
这是重要的一点,我愚蠢地没有发布在这里。 handle()甚至不是Bot的一种方法,这对我来说更愚蠢。
func handle(line string) {
ircbot := NewBot();
// get username, message etc...
ircbot .CmdInterpreter(username[1], usermessage)
}
这是正确的方法:
func (bot *Bot) handle(line string) {
// get username, message etc...
bot.CmdInterpreter(username[1], usermessage)
}
答案 0 :(得分:4)
这里的问题似乎是Connect
方法,而不是特别指针:
func (bot *Bot) Connect() (conn net.Conn, err error) {
ircbot := NewBot()
conn, err = net.Dial("tcp", bot.server+":"+bot.port)
// irc connection...
return bot.conn, nil
}
该方法被定义为(指向)Bot结构的指针,但它在此行上创建了一个新的Bot
:
ircbot := NewBot()
然后继续使用定义方法的方法(称为bot
,而不是ircbot
)。如果您选择保留它以便有单独的NewBot
和Connect
函数(这很好),那么您应该对其进行更改,以便Connect
实际使用实例化的*Bot
:
func (bot *Bot) Connect() (conn net.Conn, err error) {
conn, err = net.Dial("tcp", bot.server+":"+bot.port)
// irc connection...
return bot.conn, nil
}
并用以下内容调用它:
bot := NewBot()
conn, err := bot.Connect()
错误,
panic: runtime error: invalid memory address or nil pointer dereference
可能是因为您在bot
方法中访问Connect
(例如在bot.server
中),但尚未定义,且指针为零。