【问题标题】:Cannot use variable of type in return value不能在返回值中使用类型变量
【发布时间】:2020-04-09 16:36:17
【问题描述】:

我正在设置一个将 json 写入 golang 中的 firebase 存储桶的函数。 函数GetStorage应该创建一个新的存储实例,并从函数archiveActive中使用的函数返回它

我遇到了一个问题,我无法弄清楚 GetStorage 函数的返回类型是什么。 我在return client 行收到以下错误:

cannot use client (variable of type *storage.Client) as *storage.Client value in return statement
func GetStorage() *storage.Client {
    ctx := context.Background()
    config := &firebase.Config{
        StorageBucket: "myapp-cloud.appspot.com",
    }
    fireBaseApp := push.InitializeAppWithServiceAccount(config)
    client, err := fireBaseApp.Storage(ctx)
    if err != nil {
        log.Fatalln(err)
    }
    return client

}

func GetContext() context.Context {
    ctx := context.Background()
    ctx, cancel := context.WithTimeout(ctx, zone.Second*50)
    defer cancel()
    return ctx
}

func archiveActive(jsonData string) {
    ctx := context.Background()
    ctx, cancel := context.WithTimeout(ctx, zone.Second*50)
    defer cancel()
    client := GetStorage()
    time := zone.Now().Format("2006-01-02")
    bucket, err := client.DefaultBucket()
    if err != nil {
        log.Fatalln(err)
    }

    obj := bucket.Object("dev/archives/active/" + time)

    ...
}


但是,按照以下方式进行操作是可行的。只要新的存储客户端具有相同的功能就可以了。我只是需要帮助将功能分解成更小的部分。

func getStorageConfig() *firebase.Config {
    return &firebase.Config{
        StorageBucket: "myapp-cloud.appspot.com",
    }
}

func getContext() context.Context {
    ctx := context.Background()
    ctx, cancel := context.WithTimeout(ctx, zone.Second*50)
    defer cancel()
    return ctx
}

func archiveActive(jsonData string) {

    time := zone.Now().Format("2006-01-02")
    ctx := getContext()
    client, err := push.InitializeAppWithServiceAccount(getStorageConfig()).Storage(context.Background())
    if err != nil {
        log.Fatalln(err)
    }

    bucket, err := client.DefaultBucket()
    if err != nil {
        log.Fatalln(err)
    }

    obj := bucket.Object("dev/archives/active/" + time)
    ...
}

【问题讨论】:

  • 第一个代码sn -p中声明为返回类型的storage包与storageclient变量的类型不同。
  • 您在导入 cloud.google.com/go/storage 吗?

标签: firebase go types


【解决方案1】:

“firebase.google.com/go/storage”(这是fireBaseApp.Storage() 的返回值)和“cloud.google.com/go/storage”(似乎是GetStorage()的返回值)。这两个包的名称为storage,因此如果您需要同时导入它们,则必须使用导入别名。

如果没有看到所有代码,我不确定,但我认为这可能对你有用:

import firebaseStorage "firebase.google.com/go/storage"

...
func GetStorage() *firebaseStorage.Client {

【讨论】:

  • 是的!那行得通。哇,这是一个令人困惑的情况。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-29
  • 1970-01-01
  • 2020-09-07
  • 2013-09-28
  • 2012-08-06
  • 2011-08-14
相关资源
最近更新 更多