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

2 回复

你示例中的代码不应该(我认为也不会)产生你描述的错误。

“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 指针类型,所以需要使用上述的解决方案之一。

回到顶部