The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
awanganddong

请教下 go 怎么定义范型的

  •  
  •   awanganddong · Jan 11, 2023 · 2865 views
    This topic created in 1395 days ago, the information mentioned may be changed or developed.

    json 返回的值如下

    有值的情况下
            "nobility": {
                       "name": "",
                       "image": "",
                       "desc": ""
                   }
    无值的情况下是 
    
    "nobility": {}
    
    我该怎么定义
    
    22 replies  •  2023-01-13 10:21:18 +08:00
    MidGap
    MidGap
    Jan 11, 2023
    1
    这个和泛型看起来没什么关系。struct 就是
    MidGap
    MidGap
    Jan 11, 2023
    2
    @MidGap type T struct {
    Nobility struct {
    Name string `json:"name"`
    Image string `json:"image"`
    Desc string `json:"desc"`
    } `json:"nobility"`
    }


    不下发等于赋默认值
    janxin
    janxin
    Jan 11, 2023
    3
    https://pastebin.com/6mC3Pn6W 根据你的需求情况选择一种就可以了
    awanganddong
    awanganddong
    OP
    Jan 11, 2023
    4
    @MidGap
    ```
    nobilityInfo T.Nobility
    money := getMoney(val.Id, val.Gender)
    for _, value := range nobility {
    if money >= value.StartCoin && money <= value.EndCoin {
    nobilityInfo = T.Nobility{
    value.Name,
    pkg.AppSetting.QiniuUrl + value.Image,
    value.Desc,
    }
    break
    }
    }
    if val.Gender == 2 && val.NobilityClose == 2 {
    nobilityInfo = struct {}{}
    }
    ```
    类似于这种我该怎么赋值
    上边报错了
    awanganddong
    awanganddong
    OP
    Jan 11, 2023
    5
    ```
    type Im struct{

    Nobility T `json:"nobility"`
    Time int `json:"time"`
    IsGoddess bool `json:"is_goddess"`
    }
    type T struct {
    Nobility struct {
    Name string `json:"name"`
    Image string `json:"image"`
    Desc string `json:"desc"`
    } `json:"nobility"`
    }
    ```
    awanganddong
    awanganddong
    OP
    Jan 11, 2023
    6
    我代码是这样的
    polythene
    polythene
    Jan 11, 2023
    7
    json tag 里面加个 omitempty
    awanganddong
    awanganddong
    OP
    Jan 11, 2023
    8
    @polythene 比如我返回的值是下边的 json

    ```
    {
    "code": 200,
    "data": [
    {
    "id": 1,
    "nobility": {
    "name": "",
    "image": "",
    "desc": ""
    },
    "time": 0,
    "is_goddess": false
    },

    ],
    "msg": "ok"
    }
    ```
    我想要的效果是如果 nobility 任何一项为空,则就是空对象

    ```
    {
    "code": 200,
    "data": [
    {
    "id": 1,
    "nobility": {}, //上边的转化成这样
    "time": 0,
    "is_goddess": false
    },

    ],
    "msg": "ok"
    }
    ```
    MidGap
    MidGap
    Jan 11, 2023
    9
    @awanganddong 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
    awanganddong
    awanganddong
    OP
    Jan 11, 2023
    10
    @MidGap 我按你的方式写,我不知道怎么给 Nobility 这个 struct 赋值了。

    类似于 4 楼的问题
    awanganddong
    awanganddong
    OP
    Jan 11, 2023
    11
    @MidGap 我明白你的意思了,谢谢大家了。
    awanganddong
    awanganddong
    OP
    Jan 11, 2023
    12
    @MidGap 再请教个问题,
    我是通过 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")
    }
    yaott2020
    yaott2020
    Jan 12, 2023 via Android
    13
    为啥不把 ListenAndServe 放在外面,Shutdown 放 go func 里面
    awanganddong
    awanganddong
    OP
    Jan 12, 2023
    14
    @yaott2020 这块是 gin 的官方 demo ,我直接搬过来了
    yaott2020
    yaott2020
    Jan 12, 2023 via Android
    15
    5s 会不会太长了
    awanganddong
    awanganddong
    OP
    Jan 12, 2023
    16
    我设置成 1s,随后启动了 go 服务,然后通过 lsof -i:8000 查看 pid
    执行 kill -Hup pid
    这时候程序退出了,但是 8000 端口依然被监听。
    代码中监听了一下信号
    signal.Notify(quit, os.Interrupt, syscall.SIGQUIT, syscall.SIGHUP)
    awanganddong
    awanganddong
    OP
    Jan 12, 2023
    17
    找到个好东西

    json to go
    https://mholt.github.io/json-to-go/
    awanganddong
    awanganddong
    OP
    Jan 12, 2023
    18
    从结构中删除字段或将其隐藏在 JSON 响应中
    这个文章比较好

    https://cloud.tencent.com/developer/ask/sof/76384
    MidGap
    MidGap
    Jan 12, 2023
    19
    端口被占用的话 1.看看是不是别的进程占用了 2. 思考一下进程结束了端口真的被释放了吗?
    MidGap
    MidGap
    Jan 12, 2023
    20
    @MidGap 抱歉 没看清除是 supervisor 维护的。supervisor 重启应该要杀 pid 吧?不是太了解这个。可能没有真的结束进程
    awanganddong
    awanganddong
    OP
    Jan 13, 2023
    21
    现在发现每次启动 supervisor 启动了两个进程。supervisor 只杀了其中一个 go 进程。还有一个没有关闭。所以非常奇怪
    awanganddong
    awanganddong
    OP
    Jan 13, 2023
    22
    找到问题了,supervisorctl 配置 killasgroup=true ;默认为 false ,向进程组发送 kill 信号,包括子进程
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1833 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 06:25 · PVG 14:25 · LAX 22:25 · JFK 01:25
    ♥ Do have faith in what you're doing.