【发布时间】: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 path、file system path或pattern matching a single known package,如go run .或go run my/cmd。"
标签: go microservices