go 中的结构和使用指针

我正在尝试我的第一个 go 程序,它应该是一个非常简单的 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 [do something]”来完成,但我不会在任何地方使用它。


jeck猫
浏览 134回答 1
1回答

翻翻过去那场雪

这里的问题似乎与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方法(例如 in bot.server)但它尚未定义,并且指针为零。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go