我有一个这样的控制器功能......
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) 换句话说,如何为联合类型集中的不同类型实现特定于类型的解决方案?
鉴于以下代码...
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) 是否可以打印调用另一个文件中定义的函数的调用者源文件名,而无需__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) 我使用 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 中没有值,我想查看错误。
我需要从应用程序客户端连接到单个 Redis 实例。
由于客户端将在 Kubernetes 中复制,我正在研究有关锁的 Redis 文档,以防止客户端副本之间的竞争。
在谷歌搜索和阅读之后,我将注意力集中在这两个资源上:
SETNX此处描述的命令:https : //redis.io/commands/setnx有趣的是,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 实例上也能正常工作。
我是否正确地看到了这一点?谢谢
我的问题与另一个问题相同:如何使用变量中的凭证运行 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 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) 我有两个具有一些相同字段名称和类型的结构:
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。
每当我启动 Eclipse 语言服务器后台作业就会启动。如果我点击某个地方,Eclipse 就会滞后太多。

go ×8
generics ×2
go-gin ×2
amazon-iam ×1
aws-sdk-go ×1
c++ ×1
eclipse ×1
filenames ×1
gofmt ×1
inline ×1
linter ×1
locking ×1
redis ×1
type-switch ×1
unit-testing ×1
validation ×1
viper-go ×1
yaml ×1