Go中未定义的返回类型

Posted

技术标签:

【中文标题】Go中未定义的返回类型【英文标题】:Undefined return type in Go 【发布时间】:2016-04-04 22:39:33 【问题描述】:

我对 Go 还很陌生,并且在处理使用 mux-gorilla 会话/cookie 的代码 sn-p 时遇到了问题。我想通过以下函数减少很多冗余:

func isLoggedIn(w http.ResponseWriter, r *http.Request) (bool, *Session) 
    session, err := store.Get(r, "user")
    var logged bool = true
    if err != nil  // Need to delete the cookie.
        expired := &http.CookiePath: "/", Name: "user", MaxAge: -1, Expires: time.Now().Add(-100 * time.Hour)
        http.SetCookie(w, expired)
        logged := false
    
    return logged, session

不幸的是,我收到以下编译错误:undefined: Session

如果 store.Get 函数可以返回这个类型,怎么可能是 undefined 呢?请注意,之前使用“gorilla/sessions”包将 store 声明为 store = sessions.NewCookieStore([]byte(secret))

【问题讨论】:

【参考方案1】:

Go 需要知道在 Session 中找到哪个包:sessions.Session

错误出现在你的函数isLoggedIn的签名上

所以你修改后的代码是:

import "github.com/gorilla/sessions"
func isLoggedIn(w http.ResponseWriter, r *http.Request) (bool, *sessions.Session) 
  ...

【讨论】:

所以如果我有一个函数返回一个尚未导入的类型..只要我不专门使用那个类型,反正我不需要? 我不清楚你的问题;如果您专门命名类型(如您在函数签名中所使用的),则必须包含导入 如果您从未明确命名类型(即在函数签名中或其他地方),则可以使用返回的值而不使用导入。 只有当你想在你的代码中直接引用类型时,你才需要做一个导入。因为store.Get返回一个sessions.Session,所以可以在isLoggedIn中推断出局部变量。但是如果你想返回它,或者创建一个新的 session.Session 实例,你需要执行导入。基本上,如果你的源代码提到了包,你必须导入它。 并且,任何未在您的包中定义的类型,都必须以包为前缀。 (例外是 . 进口,但不要使用这些)

以上是关于Go中未定义的返回类型的主要内容,如果未能解决你的问题,请参考以下文章

异步数据返回中未定义的数据

为啥声明类型时可以在 redux 中未定义状态?

graphql中未定义类型的输出错误

类型错误; discord.js 中未定义的“MessageEmbed”

GraphQL 错误:输入类型中未定义字段

Store.getGroups 返回 Extjs 5.1 中未定义对象的数组