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

11 回复

抱歉,这是一个错误的代码。现在我已经编辑过了,请重新查看。

更多关于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")
}

这与我之前写的没有太大区别,但现在你可以省略参数:GetUptime()

但如果你不知道如何调用函数,你真的应该参加Go语言之旅,这是非常基础且常见的任务。你实际上已经在GetUptime函数内部调用了其他函数,我不理解调用GetUptime()与调用os.Open("/proc/uptime")有什么不同。

为了显示数据,你可能需要使用 fmt.Println()fmt.Printf()

关于如何调用你的函数,我之前已经告诉过你,但在你的函数中,除了返回 0.0 外,你从未返回任何内容。

你可能想要使用 return uptime,但我不确定你具体想在哪里返回它,因为你在循环中读取运行时间,因此可能有多个值,但你只能返回其中的一个。

另外,我不确定你为什么在那个函数中使用 time.Sleep()

Bidhan:

我在该函数中返回正常运行时间值时收到一条错误消息,提示无法解析引用?

具体的错误信息是什么?

Bidhan:

time.sleep() 每5秒返回更新的正常运行时间信息

实际上它并不会返回,而且这个语句根本不会被执行到。

你的函数运行在一个无限循环中,returntime.Sleep() 这两行代码永远不会被执行到。

  1. 移除外层循环
  2. 移除 sleep 语句
  3. 返回一个实际的值(很可能是 uptime
  4. 检查 strconv.ParseFloat() 返回的 error
  5. 使用 go fmt 格式化代码
  6. main 函数中进行循环
  7. 在 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)
}

这个修正版本:

  1. 移除了不必要的无限循环和睡眠
  2. 正确处理文件读取和解析错误
  3. 返回运行时间值和可能的错误
  4. 在main函数中调用并格式化输出不同时间单位

运行示例输出:

系统运行时间: 12345.67 秒
系统运行时间: 205.76 分钟
系统运行时间: 3.43 小时
回到顶部