如何在 GO 中访问另一个文件

Posted

技术标签:

【中文标题】如何在 GO 中访问另一个文件【英文标题】:How to access another file in GO 【发布时间】:2018-11-19 06:28:35 【问题描述】:

我正在尝试从 main.go 访问控制器,但出现以下错误:

./main.go:34:28: cannot refer to unexported name controllers.getUserDetails
./main.go:34:28: undefined: controllers.getUserDetails

这是我的main.go 的 sn-p,我删除了一些额外的代码

package main

import (
  "net/http"
  "os"
  "log"
  "github.com/urfave/negroni"
  "github.com/gorilla/mux"
  "github.com/joho/godotenv"
  "Go-Social/controllers"
 )

 func main() 
   router := mux.NewRouter()
   UserRouter := router.PathPrefix("/api/user").Subrouter()
   UserRouter.HandleFunc("", controllers.getUserDetails).Methods("GET")

   env := os.Getenv("GO_ENV")
   if "" == env 
    env = "Development"
   

   // appending middlewares
   server := negroni.Classic()

   // router handler with negroni
   server.UseHandler(router)

   // starting server
   server.Run(":" + os.Getenv(env + "_PORT"))

 

我的controller.go 文件

package controllers

import (
  "net/http"
  "fmt"
)

func getUserDetails(w http.ResponseWriter, r *http.Request) 
  fmt.Println("here")
  message := "Hello World"
  w.Write([]byte(message))


请帮助我是 Go 新手。提前致谢。

【问题讨论】:

controller.go 中将func 名称getUserDetails 转换为GetUserDetails 即可。因为从包中导出的项目的第一个字母应该是 UPPERCASE UNICODE 【参考方案1】:

要使用另一个包中的函数,您需要将其导出 (GetUserDetails)

正如here所说的

可以导出标识符以允许从另一个包访问它

func GetUserDetails(w http.ResponseWriter, r *http.Request) 
  fmt.Println("here")
  message := "Hello World"
  w.Write([]byte(message))

【讨论】:

【参考方案2】:

由于 getUserDetails 函数位于另一个包中,因此无法访问它。只能访问以大写字母开头的函数。这就是封装在 Go 中的工作原理。

func GetUserDetails(w http.ResponseWriter, r *http.Request) 
  fmt.Println("here")
  message := "Hello World"
  w.Write([]byte(message))

所以在你的主要:

UserRouter.HandleFunc("", controllers.GetUserDetails).Methods("GET")

像Java这样的语言,基于类的OOP中的enCAPSulation是通过私有和公共类变量/方法来实现的。 在 Go 中,封装是在包级别实现的。

换句话说,在 Go 中,任何包对象(类型、变量或函数)都以大写字母开头将允许您从另一个包中访问它。

【讨论】:

以上是关于如何在 GO 中访问另一个文件的主要内容,如果未能解决你的问题,请参考以下文章

如何访问全局变量

Cocos Creator 中的js文件之间调用变量或类

如何访问在另一个 js 文件中的反应挂钩中完成的状态值

如何在 Windows 中控制文件访问?

PHP - 如何在函数内访问另一个文件中的变量

如何测试一个在Go中调用另一个API端点的服务?