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

时间:2018-11-19 06:28:35

标签: go mux

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

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

这是我的main.go的摘要,我删除了一些额外的代码

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))

}

请帮助我是新手。预先感谢。

2 个答案:

答案 0 :(得分:7)

要使用其他软件包中的功能,则需要将其导出(GetUserDetails

here

  

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

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

答案 1 :(得分: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中,任何包对象(类型,变量或函数)的首字母大写都将允许您从另一个包中访问它。