Добавление нескольких функций в пакеты Cobra приводит к ошибке компиляции [ (без значения) используется в качестве значения ]

# #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 }