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 未声明?

image

有人知道这是怎么回事吗?


更多关于Golang中结构体未声明名称的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

我不完全确定你为什么在结构体中对字符串使用指针,但这样做是可行的

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,但在这个上下文中并没有声明这个变量。

回到顶部