标签: go

我如何在golang中验证rest api请求的主体结构

例如,我试图确保发布请求的正文包含正文的准确结构,如果不是,则应抛出错误

例如我有以下功能

func UpdatePassword(c *fiber.Ctx) error {

    type UpdatePasswordData struct {
        Password  string `json:"password" form:"password"`
        NewPassword string `json:"new_password" form:"new_password"`
        NewPasswordConfirm string `json:"new_password_confirm" form:"new_password_confirm"`
    }
    
    data := UpdatePasswordData{}

    if err := c.BodyParser(&data); err != nil {
        return err
    }

    var user models.User
    
    if data.NewPassword != data.NewPasswordConfirm {
        c.Status(400)
        return c.JSON(fiber.Map{
            "message": "passwords do not match",
        })
    }

    email, _ := middlewares.GetUserEmail(c)

    newPassword := models.HashPassword(data.NewPassword)

    database.DB.Model(&user).Select("Password").Where("email = ?", email).Updates(map[string]interface{}{"Password": newPassword})

    return c.JSON(user)
}
Run Code Online (Sandbox Code Playgroud)

POST 请求应该寻找具有此结构的正文

{
    "password": "oldpassword",
    "new_password": "newpassword",
    "new_password_confirm": "newpassword", …
Run Code Online (Sandbox Code Playgroud)

go go-fiber

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

即使我不读http请求的响应体,是否也需要关闭它?

我有以下代码:

resp, err = http.Head("http:something.com")
if err != nil {
    //do something
}

if resp.StatusCode == http.StatusOK {
    // do something     
}
Run Code Online (Sandbox Code Playgroud)

由于我没有阅读 的正文,因此resp我假设我不需要像 那样关闭它resp.Body.Close()。我的假设正确吗还是我应该打电话resp.Body.Close()

go go-http

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

具有名称的属性的数据存储区值类型无效

我正在尝试使用 GoLang 中的 PropertyList 将 int64 数组保存到数据存储区。

这是 PropertyList 中的属性: 列表中的属性

但是,我收到此错误: 错误信息

我知道您可以在数据存储中存储数组,尤其是基元数组。所以当我尝试通过 PropertyList 插入它时,我不确定我做错了什么。我的所有其他属性都得到正确保存(它们只是单个基元)。数组导致了这个问题。

arrays properties go google-cloud-datastore google-cloud-platform

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

无法在 mac 上运行 gomobile init 或版本

我是一个围棋新手。我正在尝试在 MacOS BigSur 上安装 gomobile 进行评估,但无法完成该init步骤。

运行go version回报go version go1.17.6 darwin/amd64

按照说明进行操作,gomobile安装似乎可以正常工作(在明确添加gomobile到我的路径后),但运行initversion失败。

gomobile: go install golang.org/x/mobile/cmd/gobind failed: exit status 1
go install: version is required when current directory is not in a module
    Try 'go install golang.org/x/mobile/cmd/gobind@latest' to install the latest version
Run Code Online (Sandbox Code Playgroud)
gomobile version unknown: cannot test gomobile binary: exit status 1, no required module provides package golang.org/x/mobile/cmd/gomobile: go.mod file not found in current directory …
Run Code Online (Sandbox Code Playgroud)

go gomobile

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

包含无效字符的字节到字符串转换

我需要解析可能无效或包含一些错误的 UDP 数据包。我想.在字节到字符串转换后替换无效字符,以显示数据包的内容。

我该怎么做?这是我的代码:

func main() {
   a := []byte{'a', 0xff, 0xaf, 'b', 0xbf}
   s := string(a)
   s = strings.Replace(s, string(0xFFFD), ".", 0)

   fmt.Println("s: ", s) // I would like to display "a..b."
   for _, r := range s {
      fmt.Println("r: ", r)
   }
   rs := []rune(s)
   fmt.Println("rs: ", rs)
}
Run Code Online (Sandbox Code Playgroud)

string utf-8 go

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

如何运行所有 Golang 基准测试(包括子文件夹)

我有一个 Go 应用程序,在根目录和名为“message”的子文件夹中包含许多单元和基准测试。

我执行以下命令从根运行所有单元测试,包括消息和任何其他子文件夹中的单元测试:

go test ./...
Run Code Online (Sandbox Code Playgroud)

我想在基准测试中实现相同的目标,即运行所有测试。以下内容适用于根目录中的内容:

go test -bench .
Run Code Online (Sandbox Code Playgroud)

/messages 文件夹中的基准测试将被忽略,这是预期的。所以我从根目录运行以下命令:

go test -bench ./...
Run Code Online (Sandbox Code Playgroud)

这根本无法识别,Go 似乎执行位于根目录中的单元测试。我什至尝试在命令中指定消息文件夹,如下所示:

go test -bench ./message
Run Code Online (Sandbox Code Playgroud)

……但也失败了。目前,如果我想在消息文件夹中运行基准测试,我必须 cd 进入该文件夹并执行

go test -bench .
Run Code Online (Sandbox Code Playgroud)

像上面一样。

那么正确的做法是什么呢?我如何告诉 Go 在根文件夹和子文件夹中查找基准测试?在 -bench 标志的情况下,正则表达式 arg 如何工作?显然它与单元测试运行程序的正则表达式不同。

testing benchmarking unit-testing go

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

Envoy WASM 由于缺少导入而无法加载(使用 net/http Go 模块)

我正在尝试运行 WASM Go 过滤器以使用 net/http 模块进行外部 HTTP 调用。Envoy 无法加载 WASM 代码。为什么导入失败?

Envoy/Istio 版本: istio/proxyv2:1.11.4

SDK版本: v0.16.1-0.20220127085108-af57b89bc067

TinyGo版本: tinygo版本0.22.0 darwin/amd64(使用go版本go1.17.6和LLVM版本13.0.0)

错误日志

2022-01-31T20:34:18.513749Z error   envoy wasm  Failed to load Wasm module due to a missing import: env.time.resetTimer
2022-01-31T20:34:18.513794Z error   envoy wasm  Failed to load Wasm module due to a missing import: env.time.stopTimer
2022-01-31T20:34:18.513807Z error   envoy wasm  Failed to load Wasm module due to a missing import: env.time.startTimer
2022-01-31T20:34:18.513817Z error   envoy wasm  Failed to load Wasm module due to a missing import: env.sync/atomic.AddInt32 …
Run Code Online (Sandbox Code Playgroud)

go webassembly istio envoyproxy tinygo

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

golang 为什么比较指向结构的两个变量的行为不同?

我创建了同一结构的两个实例,当我比较指向结构实例的两个变量时,输出感到困惑。

package main

import "fmt"

type Person struct {
    name string
}

func main() {
   p1 := &Person{name: "guru"}
   p2 := &Person{name: "guru"}
   fmt.Println(p1 == p2) // false, compares by address?
   p3 := Person{name: "guru"}
   p4 := Person{name: "guru"}
   fmt.Println(p3 == p4) // true , why? compares by content?
}
Run Code Online (Sandbox Code Playgroud)

== 运算符的工作原理与重载运算符类似吗?

comparison struct pointers go

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

通用切片参数和限制为切片类型的参数有什么区别?

考虑实验包slices。该软件包是实验性的,因此我知道签名可能会发生变化;我用它来说明问题。

考虑此包中两个函数的签名,slices.Contains并且slices.Grow

  • func Contains[E comparable](s []E, v E) bool

  • func Grow[S ~[]E, E any](s S, n int) S

第一个参数的Contains类型( s[]E的切片)受(可比较的类型)约束。EEcomparable

相反的第一个参数Grow具有类型S(只是S),并S~[]E(基础类型是 的切片的类型E)约束

然而,具有此类类型参数的函数内部允许执行的操作似乎没有任何实际差异。如果我们声明一些具有相同类型参数的伪函数,我们可以看到两者都编译得很好:

正如预期的那样,在这两个函数中,我们可以len/ capappendrange、 分配make和 索引[ ]

func fakeContains[E comparable](s []E, v E) {
    fmt.Println(len(s), cap(s))

    var e E
    fmt.Println(append(s, e))
    fmt.Println(make([]E, 4)) …
Run Code Online (Sandbox Code Playgroud)

generics go slice type-parameter

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

go struct 与泛型实现可比较

考虑版本 go1.18beta2 linux/amd64 的以下代码片段

\n
    type Vector[T comparable] struct {\n       data_ []T\n    }\n    \n    func (v *Vector[T]) Contains(e T) bool {\n       for _, x := range v.data_ {\n          if x == e {\n             return true\n          }\n       }\n       return false\n    }\n    \n    func TestVector(t *testing.T) {\n       v2 := Vector[Vector[int]]{}\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

这不会编译并给出错误:\xe2\x80\x9cVector[int] does not implement comparable\xe2\x80\x9d只是因为Vector没有定义相等运算符。但是,我找不到如何定义它们。

\n

问题:这种创建可比较结构的方法是否不允许,为什么?或者文档还没有写好?

\n

generics go

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