首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个‘*无效类型’而不是‘*Games`’?

为什么这个‘*无效类型’而不是‘*Games`’?
EN

Stack Overflow用户
提问于 2022-01-29 12:50:39
回答 1查看 1.2K关注 0票数 0

如果您在这里运行分析包:https://github.com/frederikhors/iss-goland-invalid-type

代码语言:javascript
复制
go run ./analysis

它将印刷:

代码语言:javascript
复制
field.Name: id - field.Type: string
field.Name: name - field.Type: string        
field.Name: games - field.Type: *invalid type

我不明白为什么我要用*invalid type而不是*Games

代码

  • analyis/main.go:

代码语言:javascript
复制
package main

import (
    "go/types"

    "golang.org/x/tools/go/packages"
)

func main() {
    playerModel := LoadPackage("./player.go")

    var playerStruct *types.Struct

    for _, entity := range playerModel.Types.Scope().Names() {
        if entity == "Player" {

            playerStruct = GetStruct(entity, playerModel)

            break
        }
    }

    for i := 0; i < playerStruct.NumFields(); i++ {
        field := playerStruct.Field(i)

        println("field.Name: " + field.Name() + " - field.Type: " + field.Type().String())
    }
}

func LoadPackage(path string) *packages.Package {
    const mode = packages.NeedTypes |
        packages.NeedName |
        packages.NeedSyntax |
        packages.NeedFiles |
        packages.NeedTypesInfo |
        packages.NeedTypesInfo |
        packages.NeedModule

    cfg := &packages.Config{Mode: mode}

    pkgs, err := packages.Load(cfg, path)
    if err != nil {
        panic(err)
    }

    return pkgs[0]
}

func GetStruct(structName string, pkg *packages.Package) *types.Struct {
    foundStruct := pkg.Types.Scope().Lookup(structName)

    if foundStruct == nil {
        return nil
    }

    res, _ := foundStruct.Type().Underlying().(*types.Struct)

    return res
}

  • player.go:

代码语言:javascript
复制
type Player struct {
    id    string
    name  string
    games *Games
}

  • games.go:

代码语言:javascript
复制
package main

type Games struct {
    wins   []string
    losses []string
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-29 16:54:17

您只使用LoadPackage("./player.go")显式加载单个文件。并且该文件不是声明Games类型的文件。要加载有关包的所有类型的信息,您需要加载整个包。

您需要使用LoadPackage(".")

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70905567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档