为了账号安全,请及时绑定邮箱和手机立即绑定

类型没有字段或方法读取(但它有)

类型没有字段或方法读取(但它有)

Go
烙印99 2021-09-20 11:02:35
我被这个难住了。在我正在处理的项目中,我们从 Thrift 生成 go 代码。代码在 A/B/thriftapi 包中创建(以前是 A/B/thrift,这会导致问题,因为所有生成的代码都在导入git.apache.org/thrift.git/lib/go/thrift并导致名称冲突)。我生成了代码并将代码移动到$GOPATH/src/A/B/D 我然后尝试构建我的项目并收到大量表单错误:p.X.Read undefined (type Foo has no field or method Read)我查看了其中一条违规行:import (    "A/B/D"    "git.apache.org/thrift.git/lib/go/thrift")func(p *Bar) readField1(iprot thrift.TProtocol) error {    p.X = D.NewFoo()    if err := p.X.Read(iprot); err != nil {     ... }由于我使用的是 IntelliJ,因此我按 CTRL+单击该Read()方法,果然它跳转$GOPATH/A/B/D/ttypes.go到该方法func (p *Foo) Read(iprot thrift.TProtocol) error {    ...}这正是我希望方法所在的文件,它是一个指向指针的方法,Foo所以那里没有问题。一切似乎都应该是正确的,但是在 IntelliJ 和命令行中我都遇到了这些问题。任何想法可能会出错?当它告诉我该方法不存在时令人沮丧,但如果我点击它(并且还会在智能感知中弹出)编辑 - 每条评论type Bar struct {   X Foo `thrift:"x,1,required"`    }
查看完整描述

3 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

请不要投反对票,但我想表达一个简单的代码来重现您可能遇到的情况。(我没有使用 Thrift 的经验,但我认为它更多地与包有关)


package main

import (

    "fmt"

    "D"

)


type Foo struct {}


func (f *Foo) PrintIt() {

    fmt.Println("Sample printing")

}


type Bar struct {

    // For the sake of this experiment

    X *D.Foo

}


func (b *Bar) PrintFromBar() {

    // simulates b.x = D.NewFoo()

    b.X = new(D.Foo) 

    b.X.PrintIt()   // The culprit happens here

}


func main() {

    b := new(Bar)

    b.PrintFromBar()

}

D包:


package D


type Foo struct {}

b.PrintFromBar() 失败并显示“bXPrintIt 未定义(类型 *D.Foo 没有字段或方法 PrintIt)”。


问题可能在于D.NewFoo()创建名为Foofor的别名*D.Foo。在你的情况下,因为你的Read()方法已经在 D 包中,如果没有完整的代码,我不知道。然而,有趣的是这实际上会产生相同的错误。


查看完整回答
反对 回复 2021-09-20
  • 3 回答
  • 0 关注
  • 198 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信