Как получить доступ к другому файлу в GO - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь получить доступ к контроллеру с 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))

}

Пожалуйста, помогите, я новичок в Go.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Поскольку функция 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, enCAPSulation в ООП на основе классов достигается через закрытые и открытые переменные / методы класса.,В Go инкапсуляция достигается на уровне пакета.

Другими словами, в Go, начиная с заглавной буквы для любого объекта пакета (типа, переменной или функции), вы сможете получить к нему доступ из другого пакета.

0 голосов
/ 19 ноября 2018

чтобы использовать функцию из другого пакета, вам нужно ее экспортировать (GetUserDetails)

, как сказано здесь

Идентификатор может быть экспортированразрешить доступ к нему из другого пакета

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