为了账号安全,请及时绑定邮箱和手机立即绑定

不匹配的类型 *string 和 string

不匹配的类型 *string 和 string

Go
PIPIONE 2021-11-22 18:37:41
我试图运行一个条件来基本上查看对象是否为空,但我不断收到此错误的(类似变体):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 回答

?
HUH函数

TA贡献1836条经验 获得超4个赞

从错误消息来看,您似乎正在尝试将string pointer*string) 与实际的string.

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

  • ""是一个string(是一个string值)

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

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

当一个指针引用到什么(等于nil待)试图取消引用你得到第二个错误。所以在你的情况下*release.Name恐慌,因为事实上release.Namenil


查看完整回答
反对 回复 2021-11-22
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

var release github.RepositoryTag

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


查看完整回答
反对 回复 2021-11-22
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

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

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

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

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


查看完整回答
反对 回复 2021-11-22
  • 3 回答
  • 0 关注
  • 208 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信