Golang中如何从main函数调用getuptime获取运行时间信息
Golang中如何从main函数调用getuptime获取运行时间信息
package main
import (
"time"
"os"
"bufio"
"strings"
"log"
"strconv"
"fmt"
)
func GetUptime() float64 {
for {
file, err := os.Open("/proc/uptime")
if err != nil {
log.Fatal(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
text := scanner.Text()
parts := strings.Split(text, " ")
parts1 := parts[0]
uptime, _ := strconv.ParseFloat(parts1, 64)
}
}
time.Sleep(5 * time.Second)
return
}
func main() {
}
更多关于Golang中如何从main函数调用getuptime获取运行时间信息的实战教程也可以访问 https://www.itying.com/category-94-b0.html
抱歉,这是一个错误的代码。现在我已经编辑过了,请重新查看。
更多关于Golang中如何从main函数调用getuptime获取运行时间信息的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你可以像调用其他函数一样调用它:GetUptime("")。
不过我不确定这个字符串参数是做什么用的,你在函数中并没有使用它……
谢谢,这个方法有效。
但是在主循环中使用 time.Sleep() 会导致一秒钟内输出多次立即结果。
Bidhan:
func GetUptime(procfile string) (uptime UptimeSample) {
你在任何地方都没有使用 procfile。它应该表示什么意思?
那么你的做法不正确。
func main() {
for {
fmt.Println(GetUptime())
time.Sleep(5 * time.Second)
}
}
这是我在主函数中使用它的方式,假设你已经修复了 GetUptime() 函数。如果你已经这样做了,但在同一秒内获得多个输出,说明你的 GetUptime 函数仍然有问题。
在这段代码中,我尝试提取第一个正常运行时间信息,即 parts[0],可以通过终端命令 $ cat proc/uptime 查看,该信息每5秒更新一次。
如何将正常运行时间值解析为 float64 后从 GetUptime() 函数返回,并在主函数中调用显示它?
func main() {
fmt.Println("hello world")
}
为了显示数据,你可能需要使用 fmt.Println() 或 fmt.Printf()。
关于如何调用你的函数,我之前已经告诉过你,但在你的函数中,除了返回 0.0 外,你从未返回任何内容。
你可能想要使用 return uptime,但我不确定你具体想在哪里返回它,因为你在循环中读取运行时间,因此可能有多个值,但你只能返回其中的一个。
另外,我不确定你为什么在那个函数中使用 time.Sleep()。
Bidhan:
我在该函数中返回正常运行时间值时收到一条错误消息,提示无法解析引用?
具体的错误信息是什么?
Bidhan:
time.sleep() 每5秒返回更新的正常运行时间信息
实际上它并不会返回,而且这个语句根本不会被执行到。
你的函数运行在一个无限循环中,return 和 time.Sleep() 这两行代码永远不会被执行到。
- 移除外层循环
- 移除 sleep 语句
- 返回一个实际的值(很可能是
uptime) - 检查
strconv.ParseFloat()返回的error - 使用
go fmt格式化代码 - 在
main函数中进行循环 - 在 main 函数的循环中进行
time.Sleep()
总的来说:清理一下你的代码
我在该函数中返回正常运行时间值时收到未解析引用的错误信息? 而且我也使用了fmt.Println() time.sleep() 每5秒返回更新的正常运行时间信息
如果我将上述 GetUptime 函数的代码写入主函数,用 fmt.Println(“parts[0]”) 替换 uptime, _ := strconv.ParseFloat(parts1, 64),那么它可以运行 但我想要在主函数中调用该函数
package main
import (
"time"
"os"
"bufio"
"strings"
"log"
"strconv"
"fmt"
)
func GetUptime() uptime {
for {
file, err := os.Open("/proc/uptime")
if err != nil {
log.Fatal(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
text := scanner.Text()
parts := strings.Split(text, " ")
parts1 := parts[0]
uptime, _ := strconv.ParseFloat(parts1, 64)
}
}
time.Sleep(5 * time.Second)
return uptime
}
func main() {
fmt.Println("", GetUptime())
}
在您的代码中,GetUptime函数存在几个问题:无限循环缺少退出条件、返回值位置不正确、缺少return语句。以下是修正后的版本,可以直接从main函数调用:
package main
import (
"bufio"
"fmt"
"log"
"os"
"strconv"
"strings"
)
func GetUptime() (float64, error) {
file, err := os.Open("/proc/uptime")
if err != nil {
return 0, err
}
defer file.Close()
scanner := bufio.NewScanner(file)
if scanner.Scan() {
text := scanner.Text()
parts := strings.Split(text, " ")
if len(parts) > 0 {
uptime, err := strconv.ParseFloat(parts[0], 64)
if err != nil {
return 0, err
}
return uptime, nil
}
}
return 0, fmt.Errorf("无法解析uptime数据")
}
func main() {
uptime, err := GetUptime()
if err != nil {
log.Fatal(err)
}
fmt.Printf("系统运行时间: %.2f 秒\n", uptime)
fmt.Printf("系统运行时间: %.2f 分钟\n", uptime/60)
fmt.Printf("系统运行时间: %.2f 小时\n", uptime/3600)
}
这个修正版本:
- 移除了不必要的无限循环和睡眠
- 正确处理文件读取和解析错误
- 返回运行时间值和可能的错误
- 在main函数中调用并格式化输出不同时间单位
运行示例输出:
系统运行时间: 12345.67 秒
系统运行时间: 205.76 分钟
系统运行时间: 3.43 小时


