小编bla*_*een的帖子

如何对 Go Gin 处理函数进行单元测试?

我有一个这样的控制器功能......

func GetMaterialByFilter(c *gin.Context) {

    queryParam := weldprogs.QueryParam{}
    c.BindQuery(&queryParam)
    materialByFilter, getErr := services.WeldprogService.GetMaterialByFilter(&queryParam)
    if getErr != nil {
        //TODO : Handle user creation error
        c.JSON(getErr.Status, getErr)
        return
    }
    c.JSON(http.StatusOK, materialByFilter)

}
Run Code Online (Sandbox Code Playgroud)

QueryParam 结构是这样的..

type QueryParam struct {
    Basematgroup_id []string `form:"basematgroup_id"`
    License_id      []string `form:"license_id"`
    Diameter_id     []string `form:"diameter_id"`
    Gasgroup_id     []string `form:"gasgroup_id"`
    Wiregroup_id    []string `form:"wiregroup_id"`
    Wiremat_id      []string `form:"wiremat_id"`
}
Run Code Online (Sandbox Code Playgroud)

我的测试功能是这样的..

func TestGetMaterialByFilter(t *testing.T) {
    w := httptest.NewRecorder()
    c, _ := gin.CreateTestContext(w)
    GetMaterialByFilter(c)
    assert.Equal(t, 200, w.Code) 

    var got gin.H
    err := json.Unmarshal(w.Body.Bytes(), &got)
    if …
Run Code Online (Sandbox Code Playgroud)

integration-testing unit-testing go go-gin

12
推荐指数
1
解决办法
1万
查看次数

文件未使用“-s”进行“gofmt”编辑:为什么会发生这种情况以及如何解决?

每次我们在存储库上打开或更新拉取请求时,我们都会使用 linter(适用于 Golang)来运行 Github Actions 工作流程。

它最近开始返回以下错误

File is not `gofmt`-ed with `-s` (gofmt)

在该文件的其他 PR中发生的事情之后pkg/api/api/go
(编辑:添加链接以评估并最终重现错误)

证据:

原始提交

短绒输出

我想了解这个错误的根源是什么,以及如何解决它?

go gofmt linter github-actions

12
推荐指数
2
解决办法
4万
查看次数

如何分配或返回受联合约束的通用 T?

换句话说,如何为联合类型集中的不同类型实现特定于类型的解决方案?

鉴于以下代码...

type FieldType interface {
    string | int
}

type Field[T FieldType] struct {
    name         string
    defaultValue T
}

func NewField[T FieldType](name string, defaultValue T) *Field[T] {
    return &Field[T]{
        name:         name,
        defaultValue: defaultValue,
    }
}

func (f *Field[T]) Name() string {
    return f.name
}

func (f *Field[T]) Get() (T, error) {
    value, ok := os.LookupEnv(f.name)
    if !ok {
        return f.defaultValue, nil
    }
    return value, nil
}
Run Code Online (Sandbox Code Playgroud)

编译器显示错误:

field.go:37:9: cannot use value (variable of type string) as type T in …
Run Code Online (Sandbox Code Playgroud)

generics go type-switch

12
推荐指数
1
解决办法
9025
查看次数

如何使用另一个文件中定义的函数打印当前文件名而不使用宏?

是否可以打印调用另一个文件中定义的函数的调用者源文件名,而无需__FILE__显式传递且无需使用预处理器技巧?

// Header.h

#include <iostream>
#include <string>
using namespace std;

void Log1(string msg) {
   cout << __FILE__ << msg << endl;   // this prints "Header.h"
}

void Log2(string file, string msg) {
   cout << file << msg << endl;
}

inline void Log3(string msg) {
   cout << __FILE__ << msg << endl;   // this prints "Header.h"
}


// Source.cpp

#include "Header.h"

int main()
{    
    Log1(" Test 1");
    Log2(__FILE__, " Test 2");
    Log3(" Test 3");
}
Run Code Online (Sandbox Code Playgroud)

通过这段代码,我得到的是:

pathTo\Header.h Test …
Run Code Online (Sandbox Code Playgroud)

c++ filenames inline

12
推荐指数
1
解决办法
718
查看次数

如何使Viper中的配置字段成为必填项?

我使用 Viper https://github.com/spf13/viper来管理 GO 应用程序中的项目配置,以及将配置值解组到结构体。

var config c.Configuration // Configuration is my configuration struct

err := viper.Unmarshal(&config)
Run Code Online (Sandbox Code Playgroud)

当我错过 .yml 配置文件中的某些配置时,它在解组期间不会抛出任何错误(正如我所猜测的)。

那么我怎样才能强制实施所有配置呢?如果结构体中的任何字段在 yaml 中没有值,我想查看错误。

yaml go viper-go

11
推荐指数
1
解决办法
4211
查看次数

使用 SETNX 的单实例 Redis 锁

我需要从应用程序客户端连接到单个 Redis 实例。

由于客户端将在 Kubernetes 中复制,我正在研究有关锁的 Redis 文档,以防止客户端副本之间的竞争。

在谷歌搜索和阅读之后,我将注意力集中在这两个资源上:

有趣的是,SETNX文档明确建议不要使用SETNX来实现锁,指出它基本上已经过时了:

为了支持 Redlock 算法,不鼓励使用以下模式 [...]

我们仍然记录旧模式,因为某些现有实现链接到此页面作为参考。

然而 Redlock 算法是专门为分布式锁量身定制的,因此当一个人试图锁定多个 Redis 实例时 - 它们实际上是指多个master

更进一步,库redsync (golang) 声明New函数如下:

func New(pools []Pool) *Redsync {
    return &Redsync{
        pools: pools,
    }
}
Run Code Online (Sandbox Code Playgroud)

它看起来毫无疑问是为支持 Redis 集群上的锁定而设计的。

在我的用例中,我将只连接到一个 Redis 实例。

也许我可以只使用 redsync 包并传递一个长度为 1 的切片,但在我看来,该SETNX模式在单个 Redis 实例上也能正常工作。

我是否正确地看到了这一点?谢谢

locking go redis

10
推荐指数
1
解决办法
2698
查看次数

如何使用变量中的凭证运行 AWS SDK 版本 2?

我的问题与另一个问题相同:如何使用变量中的凭证运行 AWS SDK?但我使用的是 SDK 版本 2,它不再使用 Session(如果我理解正确的话)。

因此,我正在创建一个新客户端,并且我将凭据作为变量。我需要使用 IAM 服务。这是函数:

func getIAMClient(ctx context.Context) (*iam.Client, error) {
    cfg, err := config.LoadDefaultConfig(ctx, config.WithRegion("no-region"))
    if err != nil {
        return nil, errors.Wrap(err)
    }

    cfg.HTTPClient, err = getHTTPClient(ctx)
    if err != nil {
        return nil, err
    }

    return iam.NewFromConfig(cfg), nil
}
Run Code Online (Sandbox Code Playgroud)

不同的用户将同时使用该应用程序,因此我不能只使用 ENV 文件,但我无法找到解释如何将这些凭据传递给我的客户的文档页面。任何支持将不胜感激!

go amazon-web-services amazon-iam aws-sdk-go

10
推荐指数
1
解决办法
6311
查看次数

从结构标记验证返回自定义错误消息

我将 Go 1.17 与 Gin 一起使用,我想在将数据发送到数据库之前实现结构验证。我从Gin 文档中获取了示例。

在结构中,我们可以声明不同的标签来验证字段,如下所示:

type User struct {
    FirstName      string `json:"first_name" binding:"required"`
    LastName       string `json:"last_name" binding:"required"`
    Age            uint8  `json:"age" binding:"gte=0,lte=130"`
    Email          string `json:"email" binding:"required,email"`
    FavouriteColor string `json:"favourite_color" binding:"iscolor"`
}
Run Code Online (Sandbox Code Playgroud)

在处理程序中,我可以捕获如下错误:

var u User
if err := c.ShouldBindWith(&u, binding.Query); err == nil {
    c.JSON(http.StatusOK, gin.H{"message": "Good Job"})
} else {
    c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
Run Code Online (Sandbox Code Playgroud)

错误消息将是:

{
    "error": "Key: 'User.FirstName' Error:Field validation for 'FirstName' failed on the 'required' tag\nKey: 'User.LastName' Error:Field validation for 'LastName' failed on …
Run Code Online (Sandbox Code Playgroud)

validation go go-gin

10
推荐指数
1
解决办法
2万
查看次数

如何在 Go 1.18 中访问泛型结构中的共享字段?我收到错误“类型 t 没有字段或方法 DATE_START”

我有两个具有一些相同字段名称和类型的结构:

type JOURNAL_TAG struct {
    DATE_START            time.Time
    DATE_END              time.Time
    ENTRY_NUMBER          uint
    VALUE                 float64
}

type INVENTORY_TAG struct {
    DATE_START   time.Time
    DATE_END     time.Time
    PRICE        float64
    QUANTITY     float64
    ACCOUNT_NAME string
}
Run Code Online (Sandbox Code Playgroud)

我有一个函数可以访问公共字段DATE_START,该字段应该对这些类型的切片进行排序:

func sort_by_time[t JOURNAL_TAG|INVENTORY_TAG](slice []t, is_ascending bool) {
    sort.Slice(slice, func(i, j int) bool {
        return slice[i].DATE_START.After(slice[j].DATE_START) == is_ascending
    })
}
Run Code Online (Sandbox Code Playgroud)

运行go build报编译错误:

slice[i].DATE_START undefined (type t has no field or method DATE_START)
Run Code Online (Sandbox Code Playgroud)

我想使用泛型对这两种类型的切片进行排序,可以吗?

我正在使用 go 1.18。

generics go

10
推荐指数
2
解决办法
1万
查看次数

如何摆脱语言服务器后台工作,它太烦人了,而且Eclipse速度较慢

每当我启动 Eclipse 语言服务器后台作业就会启动。如果我点击某个地方,Eclipse 就会滞后太多。

在此输入图像描述

eclipse

10
推荐指数
1
解决办法
1万
查看次数