不匹配的类型*字符串和字符串

时间:2015-11-22 08:12:30

标签: api go github-api

我试图运行一个条件,基本上看看对象是否为空,但我不断得到(类似的变化)这个错误:

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]:

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

3 个答案:

答案 0 :(得分:3)

var release github.RepositoryTag

您永远不会为该var指定任何值。这就是*release.Name给你一个“运行时错误”的原因:release.Name是一个零指针

答案 1 :(得分:2)

从错误消息中,您似乎试图将string pointer*string)与实际string进行比较。

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

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

您可能想要做的是release.Name == nil

如果引用指向任何内容(等于nil)的指针被设置为取消引用,则会出现第二个错误。因此,在您的情况下*release.Name恐慌,因为事实release.Namenil

答案 2 :(得分:1)

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

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

如果是* release.Name =="",由于发布尚未初始化,它正在抱怨"无效的内存地址或无指针取消引用"

你需要做两件事,第一次初始化,第一次发布,第二次,检查release.Name = nil。