标签: go

打印时间时出现意外输出。时间类型别名

我正在尝试为自定义类型编写一个解组函数。考虑下面的代码(游乐场

package main

import (
    "encoding/json"
    "fmt"
    "strings"
    "time"
)

type Time time.Time

func (st *Time) UnmarshalJSON(b []byte) error {
    // "2021-05-21T03:10:20.958450" -> "2021-05-21T03:10:20.958450Z"
    s := strings.Trim(string(b), "\"")
    t, err := time.Parse(time.RFC3339, fmt.Sprintf("%s%s", s, "Z"))
    if err != nil {
        return fmt.Errorf("parse time: %w", err)
    }
    *st = Time(t)
    return nil
}

type User struct {
    Name string
    TS Time
}

const data = `{"id":3, "name":"Name", "ts":"2021-05-21T03:10:20.958450"}`

func main() {
    user := new(User)
    json.Unmarshal([]byte(data), &user)
    fmt.Printf("%v\n", user)
} …
Run Code Online (Sandbox Code Playgroud)

formatting time go

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

Go中没有API网关的AWS lambda函数URL

我有一个使用 API Gateway 调用的 lambda 函数。该函数通过以下代码使用 GET 方法来工作:

func handleRequest(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {

    // add code here

    return events.APIGatewayProxyResponse{Body: request.Body, StatusCode: 200}, nil
}

func main() {
    lambda.Start(handleRequest)
}
Run Code Online (Sandbox Code Playgroud)

我有这个event.APIGatewayProxyRequestGET方法。但是当我尝试将 URL 迁移到Function URLs时,我没有类似的设置GET方法。URL 如何知道在 POSTMAN 中使用哪种方法?和...

我们有等效的方法来event.APIGatewayProxyRequest完成该请求吗?

当我使用 URL 调用它时,出现502 BAD GATEWAY错误。

go amazon-web-services aws-lambda aws-api-gateway

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

Gorm 未返回 ErrRecordNotFound

我有以下代码

func (r *WorkspaceRepository) Delete(id any) (bool, error) {
    if err := r.db.Where("id = ?", id).Delete(&model.Workspace{}).Error; err != nil {
        return false, err
    }

    return true, nil
}
Run Code Online (Sandbox Code Playgroud)

当我传递一个不存在的ID时,不会返回任何错误,就好像该记录存在一样!

删除之前我需要做什么检查,是否需要先进行SELECT?

go go-gorm

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

有没有办法在 golang 中定义可索引类型?

我最近遇到一个通过直接索引进行图形处理的库graph[key],即我有一个节点树,它的子节点位于某个属性下node.childs[key]

我想知道是否有一种方法来定义类型,以便可以通过直接键映射访问属性,例如node[key]映射到node.childs[key]. 有没有办法在定义新类型时实现这一点?

indexing types go

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

Golang:验证字符串类型的结构字段为特定值之一

戈兰版本:1.18.3

验证器:github.com/go-playground/validator/v10

我想在加载到嵌套结构数据结构后验证传入的 JSON 有效负载。这是我传入的 JSON 负载,

{
  "name": "Duro",
  "gender": "MALE",
  "tier": 3,
  "mobileNumber": "0356874586",
  "address": {
    "city": "Tokyo",
    "street": "Shibaura St"
  },
  "children":[
    {
      "title": "Mr",
      "lastName": "Takayashi"
    }
  ],
  "isEmployed": false,
  "requestedAt": "2022-01-10T03:30:12.639Z"
}
Run Code Online (Sandbox Code Playgroud)

这是我的 user.go 文件,

package main

type User struct {
        Name                   string                     `validate:"required"`
        Gender                 string                     `validate:"required,oneof=MALE FEMALE"`
        Tier                   *uint8                     `validate:"required,eq=0|eq=1|eq=2|eq=3"`
        MobileNumber           string                     `validate:"required"`
        Email                  string
        Address                *Address  `validate:"required"`
        Children               []Child   `validate:"required,dive"`
        IsEmployed             *bool     `validate:"required"`
        PreferredContactMethod string    `validate:"oneof=EMAIL PHONE POST SMS"`
        RequestedAt            time.Time …
Run Code Online (Sandbox Code Playgroud)

validation json struct go

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

分配空切片而不引用其类型?

我的代码调用一个库函数,大致如下:

func Search() ([]myLibrary.SomeObject, error) {
    var results []apiv17.SomeObject
    // ...
    if (resultsFound) {
      results = append(results, someResult)
    }
    return results
}
Run Code Online (Sandbox Code Playgroud)

...我的代码调用它,然后将其封送为 JSON。

results, err := myLibrary.Search()
bytes, err := json.Marshal(results)
Run Code Online (Sandbox Code Playgroud)

现在的问题是,由于函数的编写方式Search(假设我们无法更改它),nil如果没有结果,它将返回一个未初始化的切片。不幸的是,没有办法配置encoding/json将 nil 切片编码为[](参见例如此提案以及正在进行的讨论)。

显式检查nil解决了问题:

results, err := myLibrary.Search()
if results == nil {
  results = []apiv17.SomeObject{}
}
bytes, err := json.Marshal(results)
Run Code Online (Sandbox Code Playgroud)

...但它还添加了对返回类型 的显式依赖apiv17.SomeObject。这很不方便,因为该类型在库中经常更改。例如,在下一个库版本中可能是apiv18.SomeObject.

通过nil上述检查,每次发生这种情况时我都必须更新我的代码。

有没有办法避免这种情况,并在不显式引用变量类型的情况下为变量分配一个空的非零切片?像这样的东西:

results = [](type of results){}
Run Code Online (Sandbox Code Playgroud)

type-inference go slice

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

使用 oklog/run 的 Go 编译器出现错误“(无值)用作值”

我正在研究oklog/run包的一个简单示例,并且在尝试返回错误日志时在 VS Code 中看到此编译错误:

\n
log.Errorf("abnormal termination: %s", err) (no value) used as value\n
Run Code Online (Sandbox Code Playgroud)\n

在 group.Run 的描述中说

\n
\n

“..Run 仅在所有 actor 退出时返回。Run 返回第一个退出的 actor 返回的错误。”

\n
\n

我\xe2\x80\x99m想知道这是否与它有关,比如它可以\xe2\x80\x99t编译当前不存在的错误,因为run.Group尚未全部返回?

\n

感谢您提供的任何帮助。

\n

代码:

\n
package main\n\nimport (\n    "context"\n    "time"\n\n    "github.com/oklog/run"\n    "github.com/pkg/errors"\n    log "github.com/sirupsen/logrus"\n)\n\nfunc logAForever(ctx context.Context) {\n    for {\n        select {\n        case err := <-ctx.Done():\n            log.Error(err)\n            return\n        default:\n            log.Info("A")\n            time.Sleep(1 * time.Second)\n        }\n    }\n}\n\nfunc logBFor10Sec(ctx context.Context) {\n    for i := 1; i < 10; i++ {\n        log.Info("B")\n        time.Sleep(1 …
Run Code Online (Sandbox Code Playgroud)

compiler-errors go go-context

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

具有 React 前端的 golang Fiber 的 CORS 错误

我正在使用 golang 光纤服务器,设置如下:

package main

import (
    "go-auth/database"
    "go-auth/routes"

    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/fiber/v2/middleware/cors"
)

func main() {
    database.Connect()
    app := fiber.New()

    routes.Setup(app)

    app.Use(cors.New(cors.Config{
        AllowHeaders:     "Origin, Content-Type, Accept, Content-Length, Accept-Language, Accept-Encoding, Connection, Access-Control-Allow-Origin",
        AllowOrigins:     "*",
        AllowCredentials: true,
        AllowMethods:     "GET,POST,HEAD,PUT,DELETE,PATCH,OPTIONS",
    }))
    app.Listen(":3800")
}
Run Code Online (Sandbox Code Playgroud)

我通过 React fetch 调用它:

    const response = await fetch('http://127.0.0.1:3800/api/register', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({
            name,
            email,
            password
        })
    }).then(response => response.json());
    console.log(response);
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?服务器端已禁用 CORS。这是我得到的错误:

Access to fetch at 'http://127.0.0.1:3800/api/register' from origin 'http://localhost:3000' has been blocked by …
Run Code Online (Sandbox Code Playgroud)

go reactjs go-fiber

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

github.com/rs/zerolog 字段的延迟评估

介绍

零日志字段

github.com/rs/zerolog在我的 golang 项目中使用。

我知道我可以使用如下方式将字段添加到输出中:

package main

import (
    "os"

    "github.com/rs/zerolog"
)

func main() {
    logger := zerolog.New(os.Stderr).With().Timestamp().Logger()
    logger.Int("myIntField", 42)
    logger.Info("a regular log output") // this log entry will also contain the integer field `myIntField`
}
Run Code Online (Sandbox Code Playgroud)

但我想要的是在行运行时评估字段logger.Info("a regular log output")的值myIntField是什么。

那个设定

我有一个带有 go-routines 的生产者/消费者设置(例如,请参阅https://goplay.tools/snippet/hkoMAwqKcwj),并且我有两个整数,它们以原子方式计算仍在运行的消费者和生产者 go-routines 的数量。在拆除消费者和生产者后,我想在运行时显示这些数字。

这是使用 log 而不是 Zerolog 时的代码:

package main

import (
    "fmt"
    "log"
    "os"
    "sync"
    "sync/atomic"
)

func main() {
    numProducers := int32(3)
    numConsumers := int32(3)

    producersRunning …
Run Code Online (Sandbox Code Playgroud)

evaluation logging go zerolog defer-keyword

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

如何在 golang 中加载 .env 文件和操作系统环境变量

err := godotenv.Load(".env")
if err != nil { panic(err.Error()) }

shell := os.Getenv("SHELL")
fmt.Println(shell)
Run Code Online (Sandbox Code Playgroud)

SHELL=/bin/zsh我在文件中设置了.env,但操作系统似乎首先在操作系统环境变量列表中查找给定的键,然后检查该.env文件。有没有办法将这两者分开?

go

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