我最近从python转到了golang。我一直在使用python来处理GCP。
我过去常常传入范围,并提到我想创建的发现客户端,如下所示:
def get_client(scopes, api, version="v1"):
service_account_json = os.environ.get("SERVICE_ACCOUNT_KEY_JSON", None)
if service_account_json is None:
sys.exit("Exiting !!! No SSH_KEY_SERVICE_ACCOUNT env var found.")
credentials = service_account.Credentials.from_service_account_info(
json.loads(b64decode(service_account_json)), scopes=scopes
)
return discovery.build(api, version, credentials=credentials, cache_discovery=False)
这将创建我想要的发现客户端,无论是compute engine service
还是sqladmin
然而,在旅途中,我似乎找不到这个。我发现:https://pkg.go.dev/google.golang.org/api/discovery/v1
对于我想要创建的任何客户端,我都必须导入它,然后创建它,就像这样:
https://cloud.google.com/resource-manager/reference/rest/v1/projects/list#examples
package main
import (
"fmt"
"log"
"golang.org/x/net/context"
"golang.org/x/oauth2/google"
"google.golang.org/api/cloudresourcemanager/v1"
)
func main() {
ctx := context.Background()
c, err := google.DefaultClient(ctx, cloudresourcemanager.CloudPlatformScope)
if err != nil {
log.Fatal(err)
}
cloudresourcemanagerService, err := cloudresourcemanager.New(c)
if err != nil {
log.Fatal(err)
}
req := cloudresourcemanagerService.Projects.List()
if err := req.Pages(ctx, func(page *cloudresourcemanager.ListProjectsResponse) error {
for _, project := range page.Projects {
// TODO: Change code below to process each `project` resource:
fmt.Printf("%#vn", project)
}
return nil
}); err != nil {
log.Fatal(err)
}
}
因此,我必须导入每个客户端库来获得相应的客户端。"google.golang.org/api/cloudresourcemanager/v1"
它没有动态创建。
这可能吗,因为go是严格的类型检查
谢谢。
不,这在Golang Google Cloud库中是不可能的。
您已经明确了严格类型检查的要点,因为它肯定会破坏编译时类型检查的好处。返回具有不同签名的不同对象也是一种糟糕的Golang做法,因为我们不进行鸭子类型,而是依赖于接口契约。
Golang是无聊和冗长的,它是这样的设计:)