【问题标题】:mismatched types *string and string不匹配的类型 *string 和 string
【发布时间】:2015-11-22 08:12:29
【问题描述】:

我正在尝试运行条件以查看对象是否为空,但我不断收到此错误(类似的变体):

invalid operation: release.Name == "" (mismatched types *string and string)

这是即将死去的代码:

import (
    "github.com/google/go-github/github"
)

func TestLatestTag(user, project string) {

    var client *github.Client
    client = github.NewClient(nil)

    releases, _, err := client.Repositories.ListTags(user, project, nil)
    var release github.RepositoryTag

    if err != nil {
        fmt.Println("Error")
    } else {
        if release.Name == "" {
            fmt.Println("None")
        } else {
            fmt.Println(releases[0])
        }
    }
}

如果我将 if 语句更改为 *release.Name == "",因为错误提示我得到一个不同的错误,我不太明白:

panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x0 pc=0x26fd]

goroutine 1 [running]:

我确信有任何简单的方法可以做到这一点,但我对处理对象/结构不是很熟悉

【问题讨论】:

    标签: api go github-api


    【解决方案1】:

    从错误消息看来,您正在尝试将 string pointer (*string) 与实际的 string 进行比较。

    • release.Name*string(指向 string 值的指针)
    • ""string(是 string 值)

    它们是两种不同的类型。所以你无法比较它们。

    你可能想做的是release.Name == nil

    当尝试引用指向任何内容(等于nil)的指针取消引用时,您会收到第二个错误。所以在你的情况下*release.Name 恐慌,因为事实上release.Namenil

    【讨论】:

      【解决方案2】:
      var release github.RepositoryTag
      

      您永远不会为该变量分配任何值。这就是为什么*release.Name 给你一个“运行时错误”:release.Name 是一个空指针

      【讨论】:

        【解决方案3】:

        根据您的代码,您已声明 var release github.RepositoryTag,但尚未对其进行初始化。

        在 RepositoryTag 结构中,Name 被声明为 *string,它是一个指针,在 release.Name == "" 的情况下,尝试进行字符串比较,这是不正确的,因此出现“不匹配的类型 *string 和 string”错误。

        在*release.Name == ""的情况下,由于release尚未初始化,它会抱怨“无效的内存地址或nil指针取消引用”

        你需要做两件事,第一个初始化,释放第二个,检查 release.Name = nil。

        【讨论】:

        • 最好有一个例子,这将特别帮助任何 Go 语言初学者
        猜你喜欢
        • 2017-01-06
        • 1970-01-01
        • 2021-09-26
        • 2021-04-10
        • 2016-06-14
        • 1970-01-01
        • 2013-03-13
        • 2015-12-03
        • 2020-07-05
        相关资源
        最近更新 更多