# #go
#Вперед
Вопрос:
После добавления второй подкоманды в консольное приложение Cobra я получил сообщение об ошибке (no value) used as value
. Просматривая ошибку, она говорит, что происходит множество значений. Как будто я пытаюсь вернуть 2 значения вместо одного. Что достаточно просто, но я не уверен, как это относится к написанному мной коду. Не следует ли мне добавлять функции в тот же файл, что и код консоли cobra?
Ошибка:
go build -o azGoCLI.exe # azGoCLI/cmd cmdblob.go:40:25: DeleteContainer(args[0], args[1]) used as value
Заранее большое спасибо!
package cmd import ( "context" "log" "github.com/Azure/azure-sdk-for-go/sdk/azidentity" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" "github.com/spf13/cobra" ) func init() { rootCmd.AddCommand(mainCmd) mainCmd.AddCommand(createContainer) mainCmd.AddCommand(deleteContainer) } var mainCmd = amp;cobra.Command{ Use: "blob", Short: "...", Run: func(cmd *cobra.Command, args []string) { cmd.Usage() }, } var createContainer = amp;cobra.Command{ Use: "create-container [storageAccount] [containerName]", Short: "...", Args: cobra.MinimumNArgs(2), RunE: func(cmd *cobra.Command, args []string) error { return CreateContainer(args[0], args[1]) }, } var deleteContainer = amp;cobra.Command{ Use: "delete-container [storageAccount] [containerName]", Short: "...", Args: cobra.MinimumNArgs(2), RunE: func(cmd *cobra.Command, args []string) error { return DeleteContainer(args[0], args[1]) }, } func CreateContainer(storageaccount, container string) error { cred, err := azidentity.NewDefaultAzureCredential(nil) if err != nil { log.Fatalf("Authentication failure: % v", err) } ctx := context.Background() containerClient, err := azblob.NewContainerClient("https://" storageaccount ".blob.core.windows.net/" container, cred, nil) _, err = containerClient.Create(ctx, nil) if err != nil { log.Fatal(err) } return nil } func DeleteContainer(storageaccount, container string) { cred, err := azidentity.NewDefaultAzureCredential(nil) if err != nil { log.Fatalf("Authentication failure: % v", err) } ctx := context.Background() containerClient, err := azblob.NewContainerClient("https://" storageaccount ".blob.core.windows.net/" container, cred, nil) _, err = containerClient.Delete(ctx, nil) if err != nil { log.Fatalf("Failure: % v", err) } }
Комментарии:
1. 1. можете ли вы предоставить полную трассировку стека ошибок? 2. можете ли вы попробовать использовать
Args: cobra.ExactArgs(2),
вместоArgs: cobra.MinimumNArgs(2),
в определениях команд?2. Я обновлю его с помощью полной трассировки стека и попробую
cobra.ExactArgs
. 🙂
Ответ №1:
Как вы можете видеть, ваша функция
func DeleteContainer(storageaccount, container string) {
ничего не возвращает. Однако вы возвращаетесь к этому здесь:
var deleteContainer = amp;cobra.Command{ Use: "delete-container [storageAccount] [containerName]", Short: "...", Args: cobra.MinimumNArgs(2), RunE: func(cmd *cobra.Command, args []string) error { return DeleteContainer(args[0], args[1]) }, }
в RunE
как будто оно вернулось error
. Вот почему он выдает ошибку.’
Решение этой проблемы будет зависеть от вашего варианта использования, хотя и от того, как вы хотите обработать ошибку в случае DeleteContainer
возникновения ошибок
Комментарии:
1. Не знаю, почему они отказались, это решило мою проблему. 🙂 При добавлении возврата для функции DeleteContainer и нулевого возврата я смог устранить ошибку. Вероятно, не лучшее решение, но я взломал свой путь, подумал об этом. Спасибо!
Ответ №2:
Решение: Добавьте возвращаемое значение для функции DeleteContainer и оператор return.
func DeleteContainer(storageaccount, container string) error { cred, err := azidentity.NewDefaultAzureCredential(nil) if err != nil { log.Fatalf("Authentication failure: % v", err) } ctx := context.Background() containerClient, err := azblob.NewContainerClient("https://" storageaccount ".blob.core.windows.net/" container, cred, nil) _, err = containerClient.Delete(ctx, nil) if err != nil { log.Fatalf("Failure: % v", err) } return nil }