首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >去动态创建一个结构

去动态创建一个结构
EN

Stack Overflow用户
提问于 2015-11-20 18:32:35
回答 1查看 154关注 0票数 1

此脚本不起作用。如何通过获取传入变量的类型(如proc.ReadStat )来动态创建新的结构?( proc.ReadStat的类型为*linux.Stat,如reflect.TypeOf()所示)

代码语言:javascript
复制
package main

import (
    "fmt"
    "reflect"
    //"html"
    "log"
    "net/http"
    //"time"
    "encoding/json"
    "github.com/gorilla/mux"
    proc "github.com/c9s/goprocinfo/linux"
)



func sysinfo(w http.ResponseWriter, r *http.Request) {


    sstat, _ := proc.ReadStat("/proc/stat")
    sdiskstats, _ := proc.ReadDiskStats("/proc/diskstats")
    sloadavg, _ := proc.ReadLoadAvg("/proc/loadavg")
    smeminfo,_ := proc.ReadMemInfo("/proc/meminfo")
    smounts, _ := proc.ReadMounts("/proc/mounts")
    snetstat, _ := proc.ReadNetStat("/proc/net/netstat")
    sdevstat, _ := proc.ReadNetworkStat("/proc/net/dev")
    ssockstat, _ := proc.ReadSockStat("/proc/net/sockstat")
    svmstat, _ := proc.ReadVMStat("/proc/vmstat")

t   /* type Info interface {
        stat      *linux.Stat
        diskstats []linux.DiskStat
        loadavg   *linux.LoadAvg
        meminfo   *linux.MemInfo
        mounts    *linux.Mounts
        netstat   *linux.NetStat
        devstat   []linux.NetworkStat
        sockstat  *linux.SockStat 
        vmstat    *linux.VMStat
    }*/
    type Info struct {
        stat       reflect.TypeOf(sstat)
        diskstats  reflect.TypeOf(sdiskstats)
        loadavg    reflect.TypeOf(sloadavg)
        meminfo    reflect.TypeOf(smeminfo)
        mounts     reflect.TypeOf(smounts)
        netstat    reflect.TypeOf(snetstat)
        devstat    reflect.TypeOf(sdevstat)
        sockstat   reflect.TypeOf(ssockstat)
        vmstat     reflect.TypeOf(svmstat)
    }

    type infos []Info


    infos := info{
        stat : sstat,
        diskstats : sdiskstats,
        loadavg : sloadavg,
        meminfo : smeminfo,
        mounts : smounts,
        netstat : snetstat,
        devstat : sdevstat,
        sockstat : ssockstat,
        vmstat : svmstat,
    }

    json.NewEncoder(w).Encode(infos)


}

func main() {

    router := mux.NewRouter().StrictSlash(true)
    router.HandleFunc("/", sysinfo)
    log.Fatal(http.ListenAndServe(":8080", router))

}
EN

回答 1

Stack Overflow用户

发布于 2015-11-20 18:48:40

在静态类型语言中(Go是其中之一)类型信息(变量、字段等)必须存在并且是编译时的,所以你不能做这样的事情:

代码语言:javascript
复制
type Info struct {
    stat       reflect.TypeOf(sstat)
}

因为reflect.TypeOf()是一个将在运行时运行的函数。如果你不知道某些东西的类型,你可以使用interface{},但是你不会从编译器得到任何编译时的类型检查。

因为您只想编组结果,所以可以使用interface{}作为字段类型。还要注意,必须导出字段名(必须以大写字母开头)才能包含在JSON输出中。

因此,请尝试以下操作:

代码语言:javascript
复制
type Info struct {
    Stat       interface{}
    Diskstats  interface{}
    Loadavg    interface{}
    Meminfo    interface{}
    Mounts     interface{}
    Netstat    interface{}
    Devstat    interface{}
    Sockstat   interface{}
    Vmstat     interface{}
}

type infos []Info

infos := info{
    Stat : sstat,
    Diskstats : sdiskstats,
    Loadavg : sloadavg,
    Meminfo : smeminfo,
    Mounts : smounts,
    Netstat : snetstat,
    Devstat : sdevstat,
    Sockstat : ssockstat,
    Vmstat : svmstat,
}

json.NewEncoder(w).Encode(infos)

请注意,您也可以只使用简单的map[string]interface{}

代码语言:javascript
复制
infos := map[string]interface{}{
    "stat" : sstat,
    "diskstats" : sdiskstats,
    "loadavg" : sloadavg,
    "meminfo" : smeminfo,
    "mounts" : smounts,
    "netstat" : snetstat,
    "devstat" : sdevstat,
    "sockstat" : ssockstat,
    "vmstat" : svmstat,
}
json.NewEncoder(w).Encode(infos)

另外,请不要忘记也不要忽略错误处理:存储返回的错误并检查它们是否为nil

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33824410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档