r.Get("/category", category.List)
r.Route("/internal", func(r chi.Router) {
r.Get("/category", category.List)
})
package main
import "fmt"
type RepositoryInterface interface {
GetSubrepo() SubrepoInterface
}
type SubrepoInterface interface {
HelloSubrepo()
}
func main() {
r := Repository{subrepo: Subrepo{}}
useRepository(&r)
}
// func touchRepository(c Repository) {
func useRepository(r RepositoryInterface) {
sr := r.GetSubrepo()
sr.HelloSubrepo()
}
// ******************** Repository package ****************
type Repository struct {
subrepo Subrepo
}
func (r *Repository) GetSubrepo() SubrepoInterface {
return &r.subrepo
}
type Subrepo struct {
}
func (sr *Subrepo) HelloSubrepo() {
fmt.Printf("hello subrepo\n")
}
type Resp struct {
R struct {
Max int `json:"max"`
Items []int `json:"items"`
} `json:"r"`
}
но в любом случае ошибка вылазит, но все работает спокойно
но все работает спокойно
router.Group(func(router chi.Router) {
// вся группа роутов внутри только для аутентифицированных
// тут же можно обогатить контекст юзером
router.Use(oauth.Authorize().Handler)
// роут только для админов
router.
With(perm.WithVoters(perm.ManagerVoter(perm.AdminVoter())).
Get("/admin", AdminHandler())
// только для manager И owner одновременно
router.Group(func(router chi.Router) {
router.Use(perm.WithVoters(
perm.ManagerVoter(),
campaign.OwnerVoter("id"),
// ... любой др voter
).Handler)
router.Get("/campaign/{id}", GetCampaign())
router.Patch("/campaign/{id}", UpdateCampaign())
})
}
ctx.Done
из context.context
, который вы передадите в каждую рутину, кроме того еще создать cancel() функцию, которую вы будете вызывать в случае если вам надо...for {
select {
case job := <-jobs:
// work with job
case <-ctx.Done():
c.logger.Errorf("shutdown cancelled: %v", ctx.Err())
return // выход из горутины
}
}
}
func main() {
forever := make(chan struct{})
ctx, cancel := context.WithCancel(context.Background())
go func(ctx context.Context) {
for {
select {
case <-ctx.Done(): // if cancel() execute
forever <- struct{}{}
return
default:
fmt.Println("for loop")
}
time.Sleep(500 * time.Millisecond)
}
}(ctx)
go func() {
time.Sleep(3 * time.Second)
cancel()
}()
<-forever
fmt.Println("finish")
}