Golang中结构体未声明名称的问题
Golang中结构体未声明名称的问题 大家好:
我是Go语言的新手,正在尝试编写Terraform Provider。 以下是我正在调用的微软API。
type Repository struct {
Type *RepositoryType `json:"type,omitempty"`
}
type RepositoryResource struct {
RefName *string `json:"refName,omitempty"`
Repository *Repository `json:"repository,omitempty"`
Version *string `json:"version,omitempty"`
}
type RepositoryResourceParameters struct {
RefName *string `json:"refName,omitempty"`
// This is the security token to use when connecting to the repository.
Token *string `json:"token,omitempty"`
// Optional. This is the type of the token given. If not provided, a type of "Bearer" is assumed. Note: Use "Basic" for a PAT token.
TokenType *string `json:"tokenType,omitempty"`
Version *string `json:"version,omitempty"`
}
type RepositoryType string
我正在编写一个名为Pipeline的Provider调用,代码如下:
func expandRunPipeline(d *schema.ResourceData, forCreate bool) (*pipelines.RunPipelineParameters , string, int, error) {
Project := d.Get("project_name").(string)
variables, err := expandVariables(d)
//Ref_Name := converter.String(d.Get("sourceBranch").(string))
//token:= converter.String(d.Get("parameter_accessKey").(string))
PipelineId := d.Get("pipeline_id").(int)
if err != nil {
return nil, "",0,fmt.Errorf("Error expanding varibles: %+v", err)
}
Repository_resource :=map[string]pipelines.RepositoryResourceParameters{
RefName: d.Get("sourceBranch").(string),
"Token": converter.String(d.Get("parameter_accessKey").(string)),
}
RunResource := pipelines.RunResourcesParameters{
Repositories: &Repository_resource,
}
RunPipeline := pipelines.RunPipelineParameters{
Resources: &RunResource,
Variables: variables,
}
return &RunPipeline, Project ,PipelineId,nil
}
RefName: d.Get("sourceBranch").(string), 这一行出现了问题,提示 RefName 未声明?

有人知道这是怎么回事吗?
更多关于Golang中结构体未声明名称的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
我不完全确定你为什么在结构体中对字符串使用指针,但这样做是可行的
https://play.golang.org/p/3TBGXQ15KhU
package main
import (
"fmt"
)
type RepositoryResourceParameters struct {
RefName string `json:"refName,omitempty"`
}
func main() {
m := make(map[string]RepositoryResourceParameters)
m["RefName"] = RepositoryResourceParameters{RefName: "Hello Kitty"}
fmt.Println(m["RefName"].RefName)
}
设置值 m[“RefName”] = RepositoryResourceParameters{RefName: “Hello Kitty”}
获取值 m[“RefName”].RefName
更多关于Golang中结构体未声明名称的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
抱歉,各位。我在这里简化一下。 Playground链接
package main
import (
"fmt"
)
type StructWithMapPointer struct {
Strings *map[string]RepositoryResourceParameters
}
type RepositoryResourceParameters struct {
RefName *string `json:"refName,omitempty"`
}
func main() {
test1:="sdfsadf"
m := map[string]RepositoryResourceParameters{
RefName: test1,
}
mPointer := &m
// Set via pointer
// (*mPointer)["RefName"] = test1
// Get via pointer
fmt.Println("RefName is:", (*mPointer)["RefName"])
}
package main
import "fmt"
type StructWithMapPointer struct {
Strings *map[string]RepositoryResourceParameters
}
type RepositoryResourceParameters struct {
RefName *string `json:"refName,omitempty"`
}
func main() {
mapkey := "qwert"
refname := "sdfsadf"
m := map[string]RepositoryResourceParameters{
mapkey: RepositoryResourceParameters{RefName: &refname},
}
fmt.Println("RefName is:", *m[mapkey].RefName)
}
https://play.golang.org/p/MOFaoeLcGdZ
RefName is: sdfsadf
在Go语言中,当你使用map字面量时,键必须是字符串字面量或常量,不能是变量名。在你的代码中,RefName 被当作变量名使用,但你需要的是字符串键 "refName"。
以下是修正后的代码:
func expandRunPipeline(d *schema.ResourceData, forCreate bool) (*pipelines.RunPipelineParameters, string, int, error) {
Project := d.Get("project_name").(string)
variables, err := expandVariables(d)
PipelineId := d.Get("pipeline_id").(int)
if err != nil {
return nil, "", 0, fmt.Errorf("Error expanding variables: %+v", err)
}
// 使用字符串字面量作为map键
Repository_resource := map[string]pipelines.RepositoryResourceParameters{
"refName": { // 注意这里是字符串"refName",不是变量RefName
RefName: converter.String(d.Get("sourceBranch").(string)),
},
"Token": {
Token: converter.String(d.Get("parameter_accessKey").(string)),
},
}
RunResource := pipelines.RunResourcesParameters{
Repositories: &Repository_resource,
}
RunPipeline := pipelines.RunPipelineParameters{
Resources: &RunResource,
Variables: variables,
}
return &RunPipeline, Project, PipelineId, nil
}
或者,如果你想要使用结构体而不是map,可以这样写:
func expandRunPipeline(d *schema.ResourceData, forCreate bool) (*pipelines.RunPipelineParameters, string, int, error) {
Project := d.Get("project_name").(string)
variables, err := expandVariables(d)
PipelineId := d.Get("pipeline_id").(int)
if err != nil {
return nil, "", 0, fmt.Errorf("Error expanding variables: %+v", err)
}
// 直接创建RepositoryResourceParameters结构体
repositoryParams := pipelines.RepositoryResourceParameters{
RefName: converter.String(d.Get("sourceBranch").(string)),
Token: converter.String(d.Get("parameter_accessKey").(string)),
}
// 如果需要多个repository,使用map
repositories := map[string]pipelines.RepositoryResourceParameters{
"self": repositoryParams, // "self"是repository的名称
}
RunResource := pipelines.RunResourcesParameters{
Repositories: &repositories,
}
RunPipeline := pipelines.RunPipelineParameters{
Resources: &RunResource,
Variables: variables,
}
return &RunPipeline, Project, PipelineId, nil
}
错误的原因是Go语言的map字面量语法要求键必须是字符串字面量(用引号括起来)或常量,不能是变量标识符。当你写 RefName: 时,Go编译器会将其解释为变量 RefName,但在这个上下文中并没有声明这个变量。

