Невозможно использовать переменную типа в возвращаемом значении - PullRequest
0 голосов
/ 09 апреля 2020

Я настраиваю функцию, которая записывает json в хранилище базы данных firebase в golang. Функция 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)
    ...
}

1 Ответ

1 голос
/ 09 апреля 2020

Существует структура Client в "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 {

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...