Go:比较"google.golang.org/genproto/googleapis/api/serviceusage/v1"。带字符串的状态



我目前正在学习Go,我的第一个项目之一是获得GCP项目的列表,并确定哪些项目启用了K8s API,然后获取K8s集群的版本。

我已经设法获得了一个项目列表,我可以过滤这些项目,尽管我在比较";google.golang.org/genproto/googleapis/api/serviceusage/v1";。状态以检查K8s API是否已启用。

到目前为止,我有:


package main
import (
"fmt"
"log"
"context"
"reflect"
resourcemanager "cloud.google.com/go/resourcemanager/apiv3"
resourcemanagerpb "google.golang.org/genproto/googleapis/cloud/resourcemanager/v3"
serviceusage "cloud.google.com/go/serviceusage/apiv1"
serviceusagepb "google.golang.org/genproto/googleapis/api/serviceusage/v1"
"google.golang.org/api/iterator"
)
func main() {

ProjectMap := getGCPProjects()
if len(ProjectMap) > 0 {
fmt.Println(ProjectMap)
for key, value := range ProjectMap {
fmt.Println("Checking K8s API for " + key)
ctx := context.Background()
c, err := serviceusage.NewClient(ctx)
if err != nil{
log.Fatal(err)
}
defer c.Close()
req := &serviceusagepb.GetServiceRequest{
Name: value + "/services/container.googleapis.com",
}
resp, err := c.GetService(ctx, req)
if err != nil{
log.Fatal(err)
}
fmt.Println(reflect.TypeOf(resp.State))
fmt.Println(resp.State)
if resp.State == "ENABLED"{
fmt.Println(resp.State)
}
}
} else {
log.Fatal("ProjectMap is null.")
}

}
func getGCPProjects() map[string]string{

ProjectMap := make(map[string]string)
ctx := context.Background()
c, err := resourcemanager.NewProjectsClient(ctx)
if err != nil{
log.Fatal(err)
}
defer c.Close()
rqst := &resourcemanagerpb.SearchProjectsRequest{
Query: "state:ACTIVE",
}
it := c.SearchProjects(ctx, rqst)
for {
resp, err := it.Next()
if err == iterator.Done {
break
}
if err != nil {
log.Fatal(err)
}
fmt.Println(resp)
ProjectMap[resp.DisplayName] = resp.Name
} 
return ProjectMap
}

我想看看resp.State是否等于";ENABLED";这样我就可以继续检查部署在每个集群中的K8的版本了。然而,我目前遇到了:

无效操作:resp。状态==";ENABLED";(不匹配的类型"google.golang.org/genproto/googleapis/api/serviceusage/v1".State和未键入的字符串(

我可以以某种方式将API返回的内容转换为字符串,然后与之进行比较吗?否则,我还能怎么检查?

如有任何帮助,我们将不胜感激!

State不是字符串,而是int32

您可以将其与int32(例如2(进行比较,但最好使用定义的常量:

if resp.State == serviceusagepb.state_ENABLED {
...
}

我鼓励您考虑使用像Visual Studio Code这样的工具。(谷歌(Go团队为Go提供了一个扩展,它应该会显著改善你开发代码的体验。

在这种情况下,如果您使用Visual Studio代码和Go扩展,编辑器会突出显示代码:

resp.State == "ENABLED"

并通知您:

invalid operation: cannot compare resp.State == "ENABLED"
mismatched types "google.golang.org/genproto/googleapis/api/serviceusage/v1".State and untyped string

如果您一直在键入if resp.State == serviceusagepb.,编辑器会提示您一个可能值的列表。

Go的在线文档(pkg.go.dev(也非常出色。

对于您正在使用的软件包,您可以在其中任何一个软件包前面加上https://pkg.go.dev/{package},例如。https://pkg.go.dev/google.golang.org/genproto/googleapis/api/serviceusage/v1被带到API生成的文档中。

最新更新