我试图运行一个条件,基本上看看对象是否为空,但我不断得到(类似的变化)这个错误:
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]:
我确信有任何简单的方法可以做到这一点,但我对处理对象/结构不是很熟悉
答案 0 :(得分:3)
var release github.RepositoryTag
您永远不会为该var指定任何值。这就是*release.Name
给你一个“运行时错误”的原因:release.Name
是一个零指针
答案 1 :(得分:2)
从错误消息中,您似乎试图将string pointer
(*string
)与实际string
进行比较。
release.Name
是*string
(指向string
值的指针)""
是string
(string
值)它们是两种不同的类型。所以你无法比较它们。
您可能想要做的是release.Name == nil
如果引用指向任何内容(等于nil
)的指针被设置为取消引用,则会出现第二个错误。因此,在您的情况下*release.Name
恐慌,因为事实release.Name
是nil
答案 2 :(得分:1)
根据您的代码,您已声明var release github.RepositoryTag,但您尚未对其进行初始化。
在结构RepositoryTag中,Name被声明为* string,它是一个指针,如果是release.Name =="",则尝试进行字符串比较,这是不正确的因此"不匹配的类型*字符串和字符串"错误。
如果是* release.Name =="",由于发布尚未初始化,它正在抱怨"无效的内存地址或无指针取消引用"
你需要做两件事,第一次初始化,第一次发布,第二次,检查release.Name = nil。