我有 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) 我知道我可以向 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?
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] 这样的数组以避免一个项目覆盖另一个项目?
我正在尝试验证一个具有两个字段的结构,其中一个是必需的,另一个不是。
这是结构:
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 为真。
但是,如果我将数字定义为非零,它将阻止对“通过”字段的检查。
我尝试创建一个自定义验证器函数,但由于其中一个字段不是必需的,因此我不确定如何构建此条件。
谢谢!
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) 注意:不是使用 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)
但这也没有帮助。 …
这是我的简化配置:
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")但没有成功。
当我收到post包含要上传到服务器的文件列表的请求时,如果我通过以下方式知道该文件的名称,我可以获取特定文件
c.FormFile("filename")
但是,如果不提前知道文件名,我将如何迭代该列表中的文件呢?我没有看到context文档中列出的仅提供文件列表的方法。
如何使用 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"}
有人提到了这个问题:从恐慌中恢复的程序不会按预期退出 它工作正常,但它依赖于了解恐慌发生的位置才能放置延迟函数。我的代码如下。
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)