【问题标题】:go build doesn't recognise methodsgo build 无法识别方法
【发布时间】:2023-03-14 03:07:01
【问题描述】:

我尝试为使用 Gin 和 Mongodb 的用户设置一个小型 Golang 微服务。

package main

import (
    "context"
    "fmt"
    "github.com/wzslr321/artiver/entity"
    "github.com/wzslr321/artiver/settings"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
    "log"
    "os"
    "os/signal"
    "syscall"
    "time"
)

type application struct {
    users *entity.UserCollection
}

var app *application

func init() {
    initMongo()
}

func initMongo() {

    oc := options.Client().ApplyURI(settings.MongodbSettings.Uri)

    client, err := mongo.NewClient(oc)
    if err != nil {
        log.Fatalf("Error occured while initializing a new mongo client: %v", err)
    }

    ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second)
    defer cancel()

    err = client.Connect(ctx)
    if err != nil {
        log.Fatalf("Errorr occurred while connecting to a client: %v", err)
    }

    defer func() {
        if err = client.Disconnect(ctx); err != nil {
            panic(err)
        }
    }()

    log.Println("Successfully connected to the database!")


    app = &application{
        users: &entity.UserCollection{
            C: client.Database("artiver").Collection("users"),
        },
    }
}


func main() {

    router := app.InitRouter()

它在我的 IDE ( GoLand ) 中没有显示任何错误,但是当我尝试构建它时出现错误:

# command-line-arguments
users/cmd/app/main.go:67:15: app.InitRouter undefined (type *application has no field or method InitRouter)

在上面的图片中很容易看到,我确实可以使用这种方法。它是在同一个包中定义的。

package main

import (
    "github.com/gin-gonic/gin"
    cors "github.com/rs/cors/wrapper/gin"
    "net/http"
)


func (app *application) InitRouter() *gin.Engine {
    r := gin.New()

    r.Use(gin.Recovery())
    r.Use(cors.Default())

    r.GET("/", func(ctx *gin.Context) {
        ctx.String(http.StatusOK, "Hello World")
    })

    user := r.Group("/api/user")
    {
        user.POST("/add", app.CreateUser)

    }

    return r
}

我不知道我应该如何修复它以及做错了什么。如果有任何关于未正确完成的提示,我将不胜感激。

【问题讨论】:

  • 分享一下项目结构好吗?我只是想确认这两个文件是否属于同一个包(即包 main 在同一目录中)
  • “但是当我尝试构建它时,我得到一个错误” -- 你是如何构建它的?这是一个错误,通常是由于错误地使用go run main.go 来构建和运行程序而导致的,这样做是在明确告诉编译器编译main.go 文件。如果您通过 IDE 构建,请检查 IDE 的设置并确保它本身没有使用该不幸的命令来构建程序。
  • @xdsarkar 这是我整个项目的文件结构:``` ├── Dockerfile ├── Makefile ├── README.md ├── bin │ ├── build-errors.log │ └ ── cmd ├── conf │ ├── conf_dev.ini │ └── path.go ├── entity │ ├── error.go │ ├── user.go │ └── user_test.go ├── go .mod ├── go.sum ├── settings │ └── settings.go └── users ├── cmd │ └── app │ ├── main.go │ ├── main_test.go │ ├── router.go │ └── user.go └── Presenter └── user.go ```
  • 是的@mkopriva 我尝试使用:go build users/cmd/app/main.go
  • @Wiktor 请参阅:pkg.go.dev/cmd/go#hdr-Compile_and_run_Go_program,特别是:“通常,该包被指定为来自单个目录的 .go 源文件列表,但它也可能是 import pathfile system pathpattern matching a single known package,如 go run .go run my/cmd。"

标签: go microservices


【解决方案1】:

根据 cmets 中的 @mkopriva 帮助回答。

问题与未运行所有需要的 .go 文件有关。 就我而言,解决方案是在我的 Makefile 中以这种方式构建它: go build -o $(path)users cmd/app/*

在类似的情况下,go run . 很可能会完成这项工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 2016-04-19
    • 2017-07-24
    相关资源
    最近更新 更多