标签: go

Go - var 和 func 定义函数的区别

我有 Scala 背景,在 Scala 中,您可以将函数定义为单个值或实际函数,例如:

val inc1: Int => Int = _ + 1 // single FUNCTION value
def inc2(x: Int): Int = x + 1 // normal function definition
// in this case "inc1 eq inc1" is true, since this is a single instance
// but "inc2 eq inc2" is false
Run Code Online (Sandbox Code Playgroud)

这两个有一些差异(即大小分配,第一个是单个实例,而另一个每次调用时都会返回一个实例,...),因此根据用例,我们可以推断出一个使用。现在我是 golang 的新手,想知道以下 2 个函数定义(如果我的短语有误请纠正我)在 Golang 中是否有所不同,如果有的话,有什么不同?

var inc1 = func(x int) int { return x + 1 }
func inc2(x int) int { return x + 1 …
Run Code Online (Sandbox Code Playgroud)

go

3
推荐指数
1
解决办法
1021
查看次数

Golang:如何为 fmt.Fprintf 输出着色?

我知道我可以向 fmt.Println 输出添加颜色,如下所示:

package main

import (
    "fmt"
)

func main() {
    colorReset := "\033[0m"
    colorRed := "\033[31m"
    fmt.Println(string(colorRed), "test", string(colorReset))
    fmt.Println("next")
}
Run Code Online (Sandbox Code Playgroud)

有什么方法可以对 的输出进行着色吗fmt.Fprintf

go

3
推荐指数
1
解决办法
5184
查看次数

Golang:每个键具有多个值的映射


 func ParseportsFromFile(file string) (map[string]string, error) {
            buf, err := ioutil.ReadFile(file)
            if err != nil {
                return nil, err
            }
            ret := [make(map[string]string)]
            rows := strings.Split(string(buf), "\n")
            for _, row := range rows {
                kvs := strings.SplitN(row, "=", 2)
                if len(kvs) == 2 {
                    ret[strings.TrimSpace(kvs[0])] = strings.TrimSpace(kvs[1])
                }
            }
            return ret, nil
        }

Run Code Online (Sandbox Code Playgroud)

这个函数允许我读取这样的文件:

user1=123 
user1=321 
user2=124 
Run Code Online (Sandbox Code Playgroud)

但是返回的数据是

map[user1:321 user2:124]
Run Code Online (Sandbox Code Playgroud)

这意味着 user1=123 已被 user1=321 覆盖 如何避免这种情况?如何创建像 map[user1:[123,321], user2: 124] 这样的数组以避免一个项目覆盖另一个项目?

arrays go

3
推荐指数
1
解决办法
4582
查看次数

在Golang中使用OR条件验证结构体的两个字段

我正在尝试验证一个具有两个字段的结构,其中一个是必需的,另一个不是。

这是结构:

type man struct {
    // required: true
    Numbers []int `json:"numbers"`
    // required: false
    Pass bool `json:"pass"`
}
Run Code Online (Sandbox Code Playgroud)

为了验证我正在使用这个包: https: //pkg.go.dev/gopkg.in/validator.v2

我的目标是创造以下条件:

Numbers 非零或 pass 为真。

但是,如果我将数字定义为非零,它将阻止对“通过”字段的检查。

我尝试创建一个自定义验证器函数,但由于其中一个字段不是必需的,因此我不确定如何构建此条件。

谢谢!

validation struct go

3
推荐指数
1
解决办法
4865
查看次数

在自定义结构错误上应用“errors.Is”和“errors.As”

package main

import (
    "errors"
    "fmt"
)

type myError struct{ err error }

func (e myError) Error() string { return e.err.Error() }

func new(msg string, args ...any) error {
    return myError{fmt.Errorf(msg, args...)}
}

func (e myError) Unwrap() error        { return e.err }
func (e myError) As(target any) bool   { return errors.As(e.err, target) }
func (e myError) Is(target error) bool { return errors.Is(e.err, target) }

func isMyError(err error) bool {
    target := new("")
    return errors.Is(err, target)
}

func asMyError(err error) (error, …
Run Code Online (Sandbox Code Playgroud)

error-handling equality go

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

Gomock 使用不同的输入两次相同的方法

注意:不是使用 testify - 不同的库两次使用不同的输入和输出来重复模拟接口方法。

我正在使用该github.com/golang/mock/gomock库来模拟 HTTP 客户端接口,以测试代码的行为。Post()我的代码在客户端上使用相同的方法两次,但针对两个不同的端点。

我试过:

mockUc.EXPECT().
    Post("m-elasticsearch/_sql/translate", gomock.Eq(expectedQuery), gomock.Any(), gomock.Any()).
    SetArg(2, esQuery).
    Return(http.StatusOK, nil).
    Times(1)
mockUc.EXPECT().
    Post("m-elasticsearch/app-*/_search", gomock.Eq(esQuery), gomock.Any(), gomock.Any()).
    SetArg(2, logResults).
    Return(http.StatusOK, nil).
    Times(1)
Run Code Online (Sandbox Code Playgroud)

但这给了我错误,告诉我EXPECT()在第一次调用时正在考虑第二个:

 expected call at [...] doesn't match the argument at index 0.
        Got: m-elasticsearch/_sql/translate (string)
        Want: is equal to m-elasticsearch/app-*/_search (string)
Run Code Online (Sandbox Code Playgroud)

然后我尝试gomock.InOrder()像这样使用:

 expected call at [...] doesn't match the argument at index 0.
        Got: m-elasticsearch/_sql/translate (string)
        Want: is equal to m-elasticsearch/app-*/_search (string)
Run Code Online (Sandbox Code Playgroud)

但这也没有帮助。 …

unit-testing mocking go gomock

3
推荐指数
1
解决办法
7672
查看次数

无法从 env 获取嵌套密钥以使用 viper 覆盖 yaml 配置文件

这是我的简化配置:

stripe:
  secret_key: sk_fromconfig
Run Code Online (Sandbox Code Playgroud)

为什么 viper 不从 env 获取值?

% echo $STRIPE_SECRET_KEY
sk_fromenv
% go run main.go 
sk_fromconfig
Run Code Online (Sandbox Code Playgroud)

我希望它从 env 中获取价值,因为我有这样的一个:

% echo $STRIPE_SECRET_KEY
sk_fromenv
% go run main.go 
sk_fromenv
Run Code Online (Sandbox Code Playgroud)

这是代码:

package main

import (
    "fmt"

    viper "github.com/spf13/viper"
)

type Config struct {
    Stripe Stripe
}

type Stripe struct {
    SecretKey string `mapstructure:"secret_key"`
}

func main() {
    viper.SetConfigName("config")
    viper.SetConfigType("yaml")
    viper.AddConfigPath(".")

    viper.AutomaticEnv()
    _ = viper.ReadInConfig()

    var config Config
    _ = viper.Unmarshal(&config)

    fmt.Println(config.Stripe.SecretKey)
}
Run Code Online (Sandbox Code Playgroud)

我尝试过viper.BindEnv("STRIPE_SECRET_KEY")viper.SetEnvPrefix("STRIPE")但没有成功。

go viper-go

3
推荐指数
1
解决办法
2439
查看次数

有了 Fiber 的上下文,我如何迭代多个文件?

当我收到post包含要上传到服务器的文件列表的请求时,如果我通过以下方式知道该文件的名称,我可以获取特定文件

c.FormFile("filename")

但是,如果不提前知道文件名,我将如何迭代该列表中的文件呢?我没有看到context文档中列出的仅提供文件列表的方法。

go go-fiber

3
推荐指数
1
解决办法
2170
查看次数

如何使用golang将多行json转换为一行json?

如何使用 Go 将多行 json 转换为单行 json?

从:

{
          "release_date": "2004-11-09",
          "status": "retired",
          "engine": "Gecko",
          "engine_version": "1.7"
        }
Run Code Online (Sandbox Code Playgroud)

到:

{"release_date":"2004-11-09","status":"retired","engine":"Gecko","engine_version":"1.7"}

json go

3
推荐指数
1
解决办法
6099
查看次数

恢复恐慌后继续执行,而不知道哪个函数可能会出现恐慌

有人提到了这个问题:从恐慌中恢复的程序不会按预期退出 它工作正常,但它依赖于了解恐慌发生的位置才能放置延迟函数。我的代码如下。

package main

import "fmt"

func main() {
    defer recoverPanic()
    f1()
    f2()
    f3()
}

func f1() {
    fmt.Println("f1")
}

func f2() {
    defer f3() //<--- don't want to defer f3 here because I might not know f2 will panic, panic could occuer elsewhere
    fmt.Println("f2")
    panic("f2")
}

func f3() {
    fmt.Println("f3")
}

func recoverPanic() {
    if r := recover(); r != nil {
        fmt.Printf("Cause of panic ==>> %q\n", r)
    }
}
Run Code Online (Sandbox Code Playgroud)

在恐慌函数中延迟函数调用 f3() 是有效的,输出如下。

f1
f2
f3
Cause of …
Run Code Online (Sandbox Code Playgroud)

recover go panic

3
推荐指数
1
解决办法
757
查看次数