我遇到了将Go代码拆分为多个文件的问题。

huangapple go评论91阅读模式
英文:

Having trouble splitting go code in multiple files

问题

我有两个文件main.gogroup.go...大致如下所示:

package main

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

func main() {
	// 创建一个带有默认中间件(logger和recovery)的gin路由器
	router := gin.Default()

	v1 := router.Group("/v1")
	{
		v1.GET("/", func(c *gin.Context) {
			c.JSON(http.StatusOK, "{'sup': 'dup'}")
		})

		groups := v1.Group("/groups")
		{
			groups.GET("/", groupIndex)

			groups.GET("/:id", groupShow)
			groups.POST("/", groupCreate)
			groups.PUT("/:id", groupUpdate)
			groups.DELETE("/:id", groupDelete)
		}
	}

	// 监听并在0.0.0.0:8080上提供服务
	router.Run(":3000")
}

所以groupIndexgroupCreategroupUpdate等方法位于routes/group.go文件中:

package main

import (
	"strings"
	"github.com/gin-gonic/gin"
)


func groupIndex(c *gin.Context) {
	var group struct {
		Name        string
		Description string
	}

	group.Name = "Famzz"
	group.Description = "Jamzzz"

	c.JSON(http.StatusOK, group)
}

func groupShow(c *gin.Context) {
	c.JSON(http.StatusOK, "{'groupShow': 'someContent'}")
}

func groupCreate(c *gin.Context) {
	c.JSON(http.StatusOK, "{'groupShow': 'someContent'}")
}

func groupUpdate(c *gin.Context) {
	c.JSON(http.StatusOK, "{'groupUpdate': 'someContent'}")
}

func groupDelete(c *gin.Context) {
	c.JSON(http.StatusOK, "{'groupDelete': 'someContent'}")
}

但是当我尝试编译时,出现以下错误:

stuff/main.go:21: undefined: groupIndex
stuff/main.go:23: undefined: groupShow
stuff/main.go:24: undefined: groupCreate
stuff/main.go:25: undefined: groupUpdate
stuff/main.go:26: undefined: groupDelete

我对Go语言非常陌生,但我认为如果将文件放在同一个包中,它们应该可以相互访问。我在这里做错了什么?

英文:

I have two files main.go and group.go... it looks something like this

package main

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

func main() {
	// Creates a gin router with default middlewares:
	// logger and recovery (crash-free) middlewares
	router := gin.Default()

	v1 := router.Group("/v1")
	{
		v1.GET("/", func (c *gin.Context) {
			c.JSON(http.StatusOK, "{'sup': 'dup'}")
		})

		groups := v1.Group("/groups")
		{
			groups.GET("/", groupIndex)

			groups.GET("/:id", groupShow)
			groups.POST("/", groupCreate)
			groups.PUT("/:id", groupUpdate)
			groups.DELETE("/:id", groupDelete)
		}
	}

	// Listen and server on 0.0.0.0:8080
	router.Run(":3000")
}

So the methods groupIndex, groupCreate, groupUpdate, etc are located in another file under routes/group.go

package main

import (
  "strings"
  "github.com/gin-gonic/gin"
)


func groupIndex(c *gin.Context) {
  var group struct {
    Name string
    Description string
  }

  group.Name = "Famzz"
  group.Description = "Jamzzz"

  c.JSON(http.StatusOK, group)
}

func groupShow(c *gin.Context) {
  c.JSON(http.StatusOK, "{'groupShow': 'someContent'}")
}

func groupCreate(c *gin.Context) {
  c.JSON(http.StatusOK, "{'groupShow': 'someContent'}")
}

func groupUpdate(c *gin.Context) {
  c.JSON(http.StatusOK, "{'groupUpdate': 'someContent'}")
}

func groupDelete(c *gin.Context) {
  c.JSON(http.StatusOK, "{'groupDelete': 'someContent'}")
}

But when I try to compile I get the following error

stuff/main.go:21: undefined: groupIndex
stuff/main.go:23: undefined: groupShow
stuff/main.go:24: undefined: groupCreate
stuff/main.go:25: undefined: groupUpdate
stuff/main.go:26: undefined: groupDelete

I'm super new to go, but I thought if you put files in the same package, then they'll have access to each other. What am I doing wrong here?

答案1

得分: 3

有两种方法可以修复这个问题:

  1. 将group.go移动到与main.go相同的目录中。

  2. 将group.go作为一个包导入。将group.go中的包声明改为:

    package routes // 或者你选择的名称

通过以大写字母开头来导出函数:

func GroupIndex(c *gin.Context) {

从main中导入该包:

 import "path/to/routes"
 ...
 groups.GET("/", routes.GroupIndex)

文档如何编写Go代码对此进行了更详细的解释。

英文:

There are two ways to fix this:

  1. Move group.go to the same directory as main.go.

  2. Import group.go as a package. Change the package declaration on group.go to:

    package routes // or the name of your choice

Export the functions by starting them with a capital letter:

func GroupIndex(c *gin.Context) {

Import the package from main:

 import "path/to/routes"
 ...
 groups.GET("/", routes.GroupIndex)

The document How To Write Go Code explains this and more.

huangapple
  • 本文由 发表于 2015年6月28日 05:30:20
  • 转载请务必保留本文链接:https://go.coder-hub.com/31093706.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定