Maison >développement back-end >Golang >Problèmes courants et solutions du cadre Golang

Problèmes courants et solutions du cadre Golang

PHPz
PHPzoriginal
2024-06-03 18:38:02600parcourir

Les problèmes courants dans le développement du framework Go incluent l'incapacité d'injecter des dépendances, de simuler des requêtes HTTP et d'obtenir des identifiants utilisateur. Cet article propose des solutions : Injecter des dépendances : utilisez gorm.Model pour intégrer le modèle, créez le modèle dans le package models, créez les dépendances dans le package d'application et utilisez l'injection de fil. Requêtes HTTP simulées : à l'aide du contexte et de http.Request, créez une requête simulée et testez le contrôleur qui gère la requête. Obtenir l'ID utilisateur : obtenez les informations de l'utilisateur actuellement connecté à partir de la requête HTTP via le contexte et jwt.

Problèmes courants et solutions du cadre Golang

Problèmes et solutions courants du framework Go

Dans le développement du framework Go, vous rencontrerez des problèmes courants. Cet article présentera ces problèmes et leurs solutions, et fournira des cas pratiques.

Problème 1 : Impossible d'injecter des dépendances

C'est l'un des problèmes les plus courants lors de l'utilisation du framework Go. Pour résoudre ce problème, vous pouvez suivre ces étapes :

  • Utilisez gorm.Model pour intégrer le modèle.
  • gorm.Model 嵌入模型。
  • models 包中创建模型。
  • app 包中创建依赖项。
  • 使用 wire 注入依赖项。

实战案例:

// models/user.go
package models

import "gorm.io/gorm"

type User struct {
    gorm.Model
    Name string
}
// app/dependencies.go
package app

import "github.com/google/wire"

var UserRepoSet = wire.NewSet(
    wire.Struct(new(UserRepository), "*"),
    wire.Bind(new(UserRepository), new(IUserRepository)),
)

问题 2:如何在单元测试中模拟 HTTP 请求

对于测试控制器处理 HTTP 请求至关重要。为此,可以使用 contexthttp.Request

实战案例:

func TestUserController_CreateUser(t *testing.T) {
    ctx := context.Background()
    body := strings.NewReader("{\"name\": \"test\"}")
    req := http.Request{Body: body}

    userRepo := &userRepositoryMock{
        CreateFunc: func(*User) error {
            return nil
        },
    }

    ctrl := NewUserController(userRepo)
    w := httptest.NewRecorder()
    ctrl.CreateUser(ctx, w, &req)

    assert.Equal(t, http.StatusCreated, w.Code)
}

问题 3:如何在 HTTP 请求中获取用户 ID

在 API 中获取当前登录用户的信息非常重要。可以通过 contextjwtCréez des modèles dans le package models.

Créez des dépendances dans le package app.

Utilisez wire pour injecter des dépendances. Cas pratique :

func GetUserFromContext(ctx context.Context) (int, error) {
    claims, ok := ctx.Value("claims").(jwt.MapClaims)
    if !ok {
        return 0, errors.New("error getting claims from context")
    }

    userID := claims["user_id"].(float64)
    return int(userID), nil
}
rrreee

🎜Question 2 : Comment simuler les requêtes HTTP dans les tests unitaires 🎜🎜🎜 est crucial pour tester les contrôleurs afin de gérer les requêtes HTTP. Pour cela, utilisez context et http.Request. 🎜🎜🎜Cas pratique : 🎜🎜rrreee🎜🎜Question 3 : Comment obtenir l'identifiant de l'utilisateur dans la requête HTTP🎜🎜🎜Il est très important d'obtenir les informations de l'utilisateur actuellement connecté dans l'API. Ceci peut être réalisé via context et jwt. 🎜🎜🎜Exemple pratique : 🎜🎜rrreee🎜En résolvant ces problèmes courants, les développeurs peuvent créer des applications Go robustes et testables. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn