Golang中结构体的指针问题解析
Golang中结构体的指针问题解析 需要一点帮助:
这是示例:https://play.golang.org/p/0TEn_A7hVWM
我的错误是:pipedrive.ActivitiesCreateOptions 字面量的无效间接引用(类型为 pipedrive.ActivitiesCreateOptions)
库文件链接:https://github.com/Genert/pipedrive-api/blob/master/pipedrive/activities.go
更多关于Golang中结构体的指针问题解析的实战教程也可以访问 https://www.itying.com/category-94-b0.html
你示例中的代码不应该(我认为也不会)产生你描述的错误。
“invalid indirect of … literal” 这个错误意味着你尝试对结构体字面量进行指针解引用:*foo{ ... }。去掉星号,或者如果你想使用指针字面量,将其替换为取地址符号。
func main() {
// 错误示例
// *foo{ ... }
// 正确写法
foo{ ... }
// 或
&foo{ ... }
}
更多关于Golang中结构体的指针问题解析的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在你的代码中,错误是由于对结构体字面量使用了取地址操作符 & 导致的类型不匹配问题。让我分析一下具体情况并提供解决方案。
根据你提供的库文件链接,ActivitiesCreateOptions 结构体定义如下:
type ActivitiesCreateOptions struct {
Subject string `json:"subject"`
Type string `json:"type"`
DueDate string `json:"due_date,omitempty"`
// ... 其他字段
}
而 CreateActivity 方法的签名是:
func (s *ActivitiesService) CreateActivity(ctx context.Context, opt *ActivitiesCreateOptions) (*Activity, *Response, error)
问题分析:
错误发生在这一行:
activity, _, err := client.Activities.CreateActivity(context.Background(), &pipedrive.ActivitiesCreateOptions{
Subject: "Test Activity",
Type: "task",
DueDate: "2023-12-31",
})
解决方案:
正确的写法应该是直接传递结构体字面量,不需要使用 &:
package main
import (
"context"
"fmt"
"github.com/Genert/pipedrive-go/pipedrive"
)
func main() {
// 假设 client 已经正确初始化
activity, _, err := client.Activities.CreateActivity(context.Background(), pipedrive.ActivitiesCreateOptions{
Subject: "Test Activity",
Type: "task",
DueDate: "2023-12-31",
})
if err != nil {
fmt.Printf("Error creating activity: %v\n", err)
return
}
fmt.Printf("Created activity: %+v\n", activity)
}
或者,如果你确实需要指针,可以这样写:
// 方法1:先创建变量,再取地址
options := pipedrive.ActivitiesCreateOptions{
Subject: "Test Activity",
Type: "task",
DueDate: "2023-12-31",
}
activity, _, err := client.Activities.CreateActivity(context.Background(), &options)
// 方法2:使用 new 函数
options := &pipedrive.ActivitiesCreateOptions{
Subject: "Test Activity",
Type: "task",
DueDate: "2023-12-31",
}
activity, _, err := client.Activities.CreateActivity(context.Background(), options)
根本原因:
在 Go 中,你不能直接对结构体字面量使用取地址操作符 &,因为结构体字面量本身没有地址。编译器会报 “invalid indirect of ActivitiesCreateOptions literal” 错误。
正确的做法是:
- 直接传递结构体值(如果函数接受值类型)
- 或者先创建变量,然后传递变量的地址(如果函数接受指针类型)
在你的情况下,由于 CreateActivity 方法接受 *ActivitiesCreateOptions 指针类型,所以需要使用上述的解决方案之一。

