我正在尝试为自定义类型编写一个解组函数。考虑下面的代码(游乐场)
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) 我有一个使用 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.APIGatewayProxyRequest和GET方法。但是当我尝试将 URL 迁移到Function URLs时,我没有类似的设置GET方法。URL 如何知道在 POSTMAN 中使用哪种方法?和...
我们有等效的方法来event.APIGatewayProxyRequest完成该请求吗?
当我使用 URL 调用它时,出现502 BAD GATEWAY错误。
我有以下代码
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?
我最近遇到一个通过直接索引进行图形处理的库graph[key],即我有一个节点树,它的子节点位于某个属性下node.childs[key]。
我想知道是否有一种方法来定义类型,以便可以通过直接键映射访问属性,例如node[key]映射到node.childs[key]. 有没有办法在定义新类型时实现这一点?
戈兰版本: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) 我的代码调用一个库函数,大致如下:
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) 我正在研究oklog/run包的一个简单示例,并且在尝试返回错误日志时在 VS Code 中看到此编译错误:
\nlog.Errorf("abnormal termination: %s", err) (no value) used as value\nRun Code Online (Sandbox Code Playgroud)\n在 group.Run 的描述中说
\n\n\n“..Run 仅在所有 actor 退出时返回。Run 返回第一个退出的 actor 返回的错误。”
\n
我\xe2\x80\x99m想知道这是否与它有关,比如它可以\xe2\x80\x99t编译当前不存在的错误,因为run.Group尚未全部返回?
\n感谢您提供的任何帮助。
\n代码:
\npackage 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) 我正在使用 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) 我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) 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 ×10
aws-lambda ×1
evaluation ×1
formatting ×1
go-context ×1
go-fiber ×1
go-gorm ×1
indexing ×1
json ×1
logging ×1
reactjs ×1
slice ×1
struct ×1
time ×1
types ×1
validation ×1
zerolog ×1