Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何访问GO中的另一个文件_Go_Mux - Fatal编程技术网

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

如何访问GO中的另一个文件,go,mux,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.c

我正试图从
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))

}

请帮帮我,我是新来的。提前感谢。

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

如前所述

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


由于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中的封装是通过私有和公共类变量/方法实现的。 在Go中,封装是在包级别实现的


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

func
name
getUserDetails
转换为
controller中的
getUserDetails
。Go
将完成此操作。因为从包导出的项目的第一个字母应该是大写UNICODE。
UserRouter.HandleFunc("", controllers.GetUserDetails).Methods("GET")