结构使用指针

时间:2016-02-24 10:31:54

标签: pointers go struct

我正在尝试我的第一个程序,这应该是一个非常简单的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)
}

1 个答案:

答案 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)。如果您选择保留它以便有单独的NewBotConnect函数(这很好),那么您应该对其进行更改,以便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中),但尚未定义,且指针为零。