Golang Go语言中怎么定义范型的

发布于 1周前 作者 sinazl 来自 Go语言

json 返回的值如下

有值的情况下
        "nobility": {
                   "name": "",
                   "image": "",
                   "desc": ""
               }
无值的情况下是 

“nobility”: {}

我该怎么定义


Golang Go语言中怎么定义范型的
23 回复

这个和泛型看起来没什么关系。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 &gt;= value.StartCoin &amp;&amp; money &lt;= 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 &amp;&amp; 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(), 5
time.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 响应中
这个文章比较好

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语言的官方文档和相关资料,以充分理解其工作原理和最佳实践。

回到顶部