Как сократить объявление структуры с такими же атрибутами типа в Golang? - PullRequest
0 голосов
/ 01 января 2019

Я пытаюсь узнать о Golang языке

Сегодня у меня вопрос о экспортировать модуль в пакете с набором на Голанге.

Например, я хотел бы экспортировать UserCtrl в пакете controllers, и в пакете api можно использовать UserCtrl при импорте пакета controllers.

Также я хочу экспортировать UserCtrl с , набрав , что означает в api, я могу вызвать именованные методы , пример UserCtrl.findOne() или UserCtrl.findAll(), не использовать map[string]interface{}.

Итак, я создал новый тип UserCtrlType в виде структуры в Golang

package controllers

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

// UserCtrlType : Type controller for User
type UserCtrlType struct {
    FindAll           gin.HandlerFunc
    FindOneByID       gin.HandlerFunc
    FindOneByUsername gin.HandlerFunc
}

// UserCtrl : Controller for User
var UserCtrl = UserCtrlType{
    findAll,
    findOneByID,
    findOneByUsername,
}

func findAll(ctx *gin.Context) {

}

func findOneByID(ctx *gin.Context) {

}

func findOneByUsername(ctx *gin.Context) {

}

И в пакете api,Я импортирую controller и использую:

package api

import (
    Controllers "github.com/huynhsamha/gin-go-app/controllers"

    "github.com/gin-gonic/gin"
)

var userCtrl = Controllers.UserCtrl

func setUpUserRoutes(router *gin.RouterGroup) {
    router.GET("/", userCtrl.FindAll)
    router.GET("/n/:username", userCtrl.FindOneByUsername)
    router.GET("/d/:id", userCtrl.FindOneByID)
}

Я работаю с Джин , поэтому структура UserCtrlType повторяется много раз с типом gin.HandlerFunc.

Есть ли другой способ решения моей проблемы, который может экспортировать UserCtrl ( напечатано ) и уменьшить повторяющиеся объявления type gin.HandlerFunc.

Когда я работаю на Node.JS , я обнаружил, что экспортировать модули очень просто.Можем ли мы упростить эту проблему на Голанге?

Редактировать

Я нашел ответ на свою проблему.Я закрою этот вопрос в ближайшее время.Спасибо.

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Обычно в Go вы не создадите структуру, просто чтобы обернуть кучу объявлений функций, подобных этой;Вы бы просто экспортировали функции напрямую.

package controllers
import "github.com/gin-gonic/gin"
func FindAll(ctx *gin.Context) { ... }
router.GET("/", controllers.FindAll)

Если вы действительно хотите иметь структуру, которая содержит их как переменная ссылки на функции, существует синтаксис, чтобы не повторятьвведите:

type UserCtrlType struct {
    FindAll, FindOneByID, FindOneByUsername gin.HandlerFunc
}

В общем, в Go вы, вероятно, обнаружите, что это наименьший из ваших повторяющихся кодов (if err != nil { return err } появляется lot ).«С печатанием» не является особой концепцией в Go;Вы никогда не можете ссылаться на объект как на карту, если он не один (без прохождения пакета reflect, который должен быть особым случаем).

0 голосов
/ 01 января 2019

Я нашел ответ на мою проблему.Я думаю, что из-за моего ограниченного знания о Голанге, я не думал о более простом способе решения моей проблемы.

Вот мой ответ на мою проблему:

package controllers

import "github.com/gin-gonic/gin"

// UserCtrl : Controller for User
type UserCtrl struct{}

// FindAll :
func (ctrl UserCtrl) FindAll(ctx *gin.Context) {

}

// FindOneByID :
func (ctrl UserCtrl) FindOneByID(ctx *gin.Context) {

}

// FindOneByUsername :
func (ctrl UserCtrl) FindOneByUsername(ctx *gin.Context) {

}

И в упаковкеapi

package api

import (
    Controllers "github.com/huynhsamha/gin-go-app/controllers"

    "github.com/gin-gonic/gin"
)

var userCtrl = Controllers.UserCtrl{}

func setUpUserRoutes(router *gin.RouterGroup) {
    router.GET("/", userCtrl.FindAll)
    router.GET("/n/:username", userCtrl.FindOneByUsername)
    router.GET("/d/:id", userCtrl.FindOneByID)
}

Я закрою этот вопрос.Спасибо за внимание.

...