我正在清理一些代码并尝试将一个切片值传递给函数。
我的结构看起来像这样:
type GetRecipesPaginatedResponse struct {
Total int `json:"total"`
PerPage int `json:"per_page"`
CurrentPage int `json:"current_page"`
LastPage int `json:"last_page"`
NextPageURL string `json:"next_page_url"`
PrevPageURL interface{} `json:"prev_page_url"`
From int `json:"from"`
To int `json:"to"`
Data []struct {
ID int `json:"id"`
ParentRecipeID int `json:"parent_recipe_id"`
UserID int `json:"user_id"`
Name string `json:"name"`
Description string `json:"description"`
IsActive bool `json:"is_active"`
IsPublic bool `json:"is_public"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
BjcpStyle struct {
SubCategoryID string `json:"sub_category_id"`
CategoryName string `json:"category_name"`
SubCategoryName string `json:"sub_category_name"`
} `json:"bjcp_style"`
UnitType struct {
ID int `json:"id"`
Name string `json:"name"`
} `json:"unit_type"`
} `json:"data"`
}
在我的代码中,我从API获取一些JSON数据,并获得包含Data
切片中约100个项目的回复。
然后我循环遍历Data
切片中的每个项目并进行处理。
例如,它看起来像这样:
for page := 1; page < 3; page++ {
newRecipes := getFromRecipesEndpoint(page, latestTimeStamp) //this returns an instance of GetRecipesPaginatedResponse
for _, newRecipe := range newRecipes.Data {
if rowExists(db, "SELECT id from community_recipes WHERE id=@id", sql.Named("id", newRecipe.ID)) {
insertIntoRecipes(db, true, newRecipe)
} else {
insertIntoRecipes(db, false, newRecipe)
}
}
}
所以我试图将配方实例传递给insertIntoRecipes
函数,如下所示:
func insertIntoRecipes(db *sql.DB, exists bool, newRecipe GetRecipesPaginatedResponse.Data) {
if exists {
//update the existing record in the DB
//perform some other updates with the information
} else {
//insert a new record into the DB
//insert some other information using this information
}
}
当我运行时,我收到错误:
GetRecipesPaginatedResponse.Data undefined(类型GetRecipesPaginatedResponse没有方法数据)
我可以说问题与我试图将newRecipe
传递给insertIntoRecipes
函数newRecipe GetRecipesPaginatedResponse.Data
有关,但是我不太确定如何通过它in并声明正确的变量类型。
要将Data
切片内的项目传递给函数,当我循环遍历Data
切片的每个项目时,我该怎么做?
答案 0 :(得分:4)
您无法使用字段选择器引用Data
字段的匿名类型。修复方法是为Data
字段声明一个命名类型:
type GetRecipesPaginatedResponse struct {
...
Data []DataItem
...
}
type DataItem struct {
ID int `json:"id"`
ParentRecipeID int `json:"parent_recipe_id"`
UserID int `json:"user_id"`
Name string `json:"name"`
...
}
像这样使用:
func insertIntoRecipes(db *sql.DB, exists bool, newRecipe DataItem) {
...
}
DataItem
可能是一个更好的名字。