I am trying my hand on my first go program which is supposed to be a very simple IRC bot.
I have the part of the connections etc done but I am confused with structs and pointers such. The structs are new to me coming from languages that use classes.
I have this struct and the constructor for it:
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,
}
}
My connect() method looks like this
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
}
Everything of that works fine the problem I am having is with another method to my struct named Message. It's just supposed to send a message. Looks like this:
// Message to send a message
func (bot *Bot) Message(message string) {
if message == "" {
return
}
fmt.Printf("Bot: " + message + "
")
fmt.Fprintf(bot.conn, "PRIVMSG "+bot.channel+" :"+message+"
")
}
everytime when I then try to use this function I get this error and the program crashes
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x20 pc=0x463d73]
I'm unsure about how to use the & and * signs correctly to achieve what I want to do.
I thought a goroutine is something that is for multithreading and is done by saying "go [do something]" but I don't use that anywhere.
Edit: Solution
Thanks I found the solution! For those interested: I created a new instance of Bot in the place where I called the Message() function which resulted in an empty conn.
This was the important bit, I stupidly didn't post here. handle() wasn't even a method of Bot which is even more stupid of me.
func handle(line string) {
ircbot := NewBot();
// get username, message etc...
ircbot .CmdInterpreter(username[1], usermessage)
}
and this is the correct way:
func (bot *Bot) handle(line string) {
// get username, message etc...
bot.CmdInterpreter(username[1], usermessage)
}