Golang Go语言中怎么定义范型的
json 返回的值如下
有值的情况下
"nobility": {
"name": "",
"image": "",
"desc": ""
}
无值的情况下是
“nobility”: {}
我该怎么定义
Golang Go语言中怎么定义范型的
这个和泛型看起来没什么关系。struct 就是
更多关于Golang Go语言中怎么定义范型的的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
type T struct {
Nobility struct {
Name string json:"name"
Image string json:"image"
Desc string json:"desc"
} json:"nobility"
}
不下发等于赋默认值
https://pastebin.com/6mC3Pn6W 根据你的需求情况选择一种就可以了
<br> nobilityInfo T.Nobility<br> money := getMoney(<a target="_blank" href="http://val.Id" rel="nofollow noopener">val.Id</a>, val.Gender)<br> for _, value := range nobility {<br> if money >= value.StartCoin && money <= value.EndCoin {<br> nobilityInfo = T.Nobility{<br> <a target="_blank" href="http://value.Name" rel="nofollow noopener">value.Name</a>,<br> pkg.AppSetting.QiniuUrl + value.Image,<br> value.Desc,<br> }<br> break<br> }<br> }<br> if val.Gender == 2 && val.NobilityClose == 2 {<br> nobilityInfo = struct {}{}<br> }<br>
类似于这种我该怎么赋值
上边报错了
<br>type Im struct{<br><br> Nobility T `json:"nobility"`<br> Time int `json:"time"`<br> IsGoddess bool `json:"is_goddess"`<br>}<br>type T struct {<br> Nobility struct {<br> Name string `json:"name"`<br> Image string `json:"image"`<br> Desc string `json:"desc"`<br> } `json:"nobility"`<br>}<br>
我代码是这样的
json tag 里面加个 omitempty
比如我返回的值是下边的 json<br>{<br> "code": 200,<br> "data": [<br> {<br> "id": 1,<br> "nobility": {<br> "name": "",<br> "image": "",<br> "desc": ""<br> },<br> "time": 0,<br> "is_goddess": false<br> },<br> <br> ],<br> "msg": "ok"<br>}<br>
我想要的效果是如果 nobility 任何一项为空,则就是空对象<br>{<br> "code": 200,<br> "data": [<br> {<br> "id": 1,<br> "nobility": {}, //上边的转化成这样<br> "time": 0,<br> "is_goddess": false<br> },<br> <br> ],<br> "msg": "ok"<br>}<br>
type T struct {
Nobility struct {
Name string json:"name,omitempty"
Image string json:"image,omitempty"
Desc string json:"desc,omitempty"
} json:"nobility,omitempty"
}
加 ,omitempty ,这样你把这个结构转 JSON ,默认值就会不下发,比如 nil 0 “” false
我按你的方式写,我不知道怎么给 Nobility 这个 struct 赋值了。
类似于 4 楼的问题
我明白你的意思了,谢谢大家了。
再请教个问题,
我是通过 supervisor 来守护 go
我通过 supervisorctl stop program 关闭程序
然后再重启的时候,报接口被占用的错误
2023/01/11 22:38:38 listen: listen tcp :8000: bind: address already in use
我已经配置了优化退出,还是出问题。
package main
import (
“context”
“log”
“net/http”
“os”
“os/signal”
“time”
“github.com/gin-gonic/gin”
)
func main() {
router := gin.Default()
router.GET("/", func(c gin.Context) {
time.Sleep(5 * time.Second)
c.String( http.StatusOK, “Welcome Gin Server”)
})
srv := &http.Server{
Addr: “:8080”,
Handler: router,
}
go func() {
// 服务连接
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf(“listen: %s\n”, err)
}
}()
// 等待中断信号以优雅地关闭服务器(设置 5 秒的超时时间)
quit := make(chan os.Signal)
signal.Notify(quit, os.Interrupt)
<-quit
log.Println(“Shutdown Server …”)
ctx, cancel := context.WithTimeout(context.Background(), 5time.Second)
defer cancel()
if err := srv.Shutdown(ctx); err != nil {
log.Fatal(“Server Shutdown:”, err)
}
log.Println(“Server exiting”)
}
为啥不把 ListenAndServe 放在外面,Shutdown 放 go func 里面
这块是 gin 的官方 demo ,我直接搬过来了
5s 会不会太长了
我设置成 1s,随后启动了 go 服务,然后通过 lsof -i:8000 查看 pid
执行 kill -Hup pid
这时候程序退出了,但是 8000 端口依然被监听。
代码中监听了一下信号
signal.Notify(quit, os.Interrupt, syscall.SIGQUIT, syscall.SIGHUP)
找到个好东西
json to go
https://mholt.github.io/json-to-go/
从结构中删除字段或将其隐藏在 JSON 响应中
这个文章比较好
https://cloud.tencent.com/developer/ask/sof/76384
端口被占用的话 1.看看是不是别的进程占用了 2. 思考一下进程结束了端口真的被释放了吗?
抱歉 没看清除是 supervisor 维护的。supervisor 重启应该要杀 pid 吧?不是太了解这个。可能没有真的结束进程
现在发现每次启动 supervisor 启动了两个进程。supervisor 只杀了其中一个 go 进程。还有一个没有关闭。所以非常奇怪
找到问题了,supervisorctl 配置 killasgroup=true ;默认为 false ,向进程组发送 kill 信号,包括子进程
在Golang(也称为Go语言)中,范型(Generics)是从Go 1.18版本开始引入的一个重要特性,它允许你编写更加通用和可复用的代码。范型主要通过类型参数(type parameters)来实现,这些类型参数在函数、类型或方法中被声明,并在实际使用时被具体的类型实例化。
要定义一个范型函数,你可以使用类型参数列表来指定类型参数。以下是一个简单的例子,展示了如何定义一个接受任意类型参数的函数:
package main
import "fmt"
// 定义一个范型函数,T 是类型参数
func Print[T any](value T) {
fmt.Println(value)
}
func main() {
Print[int](42) // 使用 int 类型实例化 T
Print[string]("hello") // 使用 string 类型实例化 T
// Go 1.18+ 还支持类型推断,所以你也可以直接写 Print(42) 和 Print("hello")
}
在这个例子中,Print
函数是一个范型函数,它接受一个类型参数 T
,该参数被约束为 any
(在旧版本中称为 interface{}
,表示任意类型)。这意味着 Print
函数可以接受任何类型的参数。
请注意,Go的范型系统相对简单,目前只支持在函数、结构体和方法中使用类型参数,而不支持在接口中使用。此外,类型参数还受到一些约束和限制,以确保类型安全。在使用范型时,建议仔细阅读Go语言的官方文档和相关资料,以充分理解其工作原理和最佳实践。