此脚本不起作用。如何通过获取传入变量的类型(如proc.ReadStat )来动态创建新的结构?( proc.ReadStat的类型为*linux.Stat,如reflect.TypeOf()所示)
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))
}发布于 2015-11-20 18:48:40
在静态类型语言中(Go是其中之一)类型信息(变量、字段等)必须存在并且是编译时的,所以你不能做这样的事情:
type Info struct {
stat reflect.TypeOf(sstat)
}因为reflect.TypeOf()是一个将在运行时运行的函数。如果你不知道某些东西的类型,你可以使用interface{},但是你不会从编译器得到任何编译时的类型检查。
因为您只想编组结果,所以可以使用interface{}作为字段类型。还要注意,必须导出字段名(必须以大写字母开头)才能包含在JSON输出中。
因此,请尝试以下操作:
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{}
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!
https://stackoverflow.com/questions/33824410
复制相似问题