我目前正在学习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生成的文档中。