2015-11-22 105 views
-1

我試圖運行條件基本上看如果對象是空的,但這個錯誤我不斷收到(類似的變化):類型不匹配*字符串,字符串

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

我敢肯定,有什麼簡單的方法來做到這一點,但我不是很熟悉,處理的對象/結構

回答

1

根據你的代碼你聲明var釋放github.RepositoryTag,但你還沒有初始化它。

在結構RepositoryTag中,Name被聲明爲* string,它是一個指針,並且在release.Name ==「」的情況下,嘗試字符串比較不正確,因此出現「mismatched types * string and string」錯誤。

在* release.Name ==「」,自發布尚未初始化,則抱怨「無效的內存地址或零指針引用」

你需要做兩件事情,第一個初始化,釋放的情況下,第二,檢查release.Name = nil。

1

從錯誤消息,它看起來像你正試圖以比較string pointer*string)和實際string

  • release.Name*string(一個指針指向一個string值)
  • ""string(是string值)

這是兩個不同的類型。所以你不能比較它們。

你可能想要做的,而不是什麼是release.Name == nil

當該引用不了了之(等於nil)試圖將指針解除引用你得到第二個錯誤。所以你的情況*release.Name恐慌,因爲INFACT release.Namenil

3
var release github.RepositoryTag 

你從來沒有任何值分配給該變種。這就是爲什麼*release.Name給你一個「運行時錯誤」:release.Name是一個零指針