golang获取命令行参数



对于C\C++,java,或C#程序,我们可以通过入口函数(main函数)直接获取命令行参数:
int main(int argc, char **argv)
{
 printf("%s", argv[1]);
 return 0;
}

但是,golang的入口函数没有参数,无法直接获取命令行参数:

fun main() {

}


对于golang,获取命令行参数,只能通过golang提供的标准包os,或flag。

flag只能解析标准的命令行参数,例如:

program.exe -h 192.168.1.194 或 program --host 192.168.1.194(用空着将参数名和参数值分开)

program.exe -h=192.168.1.194 或 program --host=192.168.1.194(用"="将参数名和参数值分开)

program.exe -d(不带值表示bool类型,并且置为true,不加-d表示该间值为false)

获取方式如下:

 host := flag.String("h", "127.0.0.1", "host")
 daemon := flag.Bool("d", false, "daemon")

第一参数表示参数名,第二个参数表示参数值(默认),第三个参数为参数说明(意义描述)

但在使用host和daemon之前,需要调用flag.Parse()来解析命令行,因为前两句仅仅将参数存储地址告诉了flag,需要执行Parse方法之后,参数值才能写入变量


对于非标准命令行格式(如 program.exe /h192.168.1.194),我们只能通过os.Args来获取,然后自己解析

获取方式如下:

hoststr := os.Args[1] (Args[0]为program.exe)


完整源码如下:

package main

import (
	"flag"
	"fmt"
	"os"
)

func main() {
	host := flag.String("h", "127.0.0.1", "host")
	daemon := flag.Bool("d", false, "daemon")
	flag.Parse()
	fmt.Println(*host)
	fmt.Println(*daemon)
	fmt.Println(os.Args)
}

运行结果:

flagtest.exe -h 192.168.1.194 -d

191.168.1.194

true

[flagtest.exe -h 192.168.1.194 -d]



flagtest.exe -h 192.168.1.194

191.168.1.194

false

[flagtest.exe -h 192.168.1.194]


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在Golang获取CPU序列号需要使用一些操作系统相关的功能。首先,需要导入相关的包: ```go import ( "fmt" "os/exec" "strings" ) ``` 然后,在函数中使用命令行工具获取CPU序列号。根据操作系统的不同,使用不同的命令行工具。以下是在Windows和Linux操作系统上获取CPU序列号的示例代码: ```go func getCPUSerialNumber() (string, error) { var cmd *exec.Cmd var output []byte var err error if strings.Contains(strings.ToLower(runtime.GOOS), "windows") { // For Windows cmd = exec.Command("wmic", "cpu", "get", "processorid") output, err = cmd.Output() if err != nil { return "", err } } else if strings.Contains(strings.ToLower(runtime.GOOS), "linux") { // For Linux cmd = exec.Command("cat", "/proc/cpuinfo") output, err = cmd.Output() if err != nil { return "", err } } // Parse CPU serial number from the output lines := strings.Split(string(output), "\n") for _, line := range lines { if strings.Contains(line, "ProcessorId") { fields := strings.Fields(line) if len(fields) >= 2 { return fields[1], nil } } } // Unable to find CPU serial number return "", fmt.Errorf("Failed to get CPU serial number") } ``` 这个函数首先根据操作系统类型选择使用Windows的wmic命令或者Linux的cat命令获取CPU信息。然后从输出中解析出CPU序列号并返回。 注意,这段代码假设用户已经安装了相应的命令行工具(如wmic),并且具有执行权限。另外,对于其他操作系统,可能需要使用不同的命令或者API来获取CPU序列号。 ### 回答2: 在Golang中,可以使用`syscall`包来获取CPU序列号。以下是一个简单的示例代码: ```go package main import ( "fmt" "syscall" "unsafe" ) func main() { info := &syscall.Systeminfo{} err := syscall.GetSystemInfo(info) if err != nil { fmt.Println("获取系统信息失败:", err) return } cpuInfo := make([]uint32, 20) procId, _, _ := syscall.MustLoadDLL("kernel32.dll").MustFindProc("GetVolumeInformationW") _, _, _ = procId.Call( uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr("C:\\"))), 0, uintptr(unsafe.Pointer(&cpuInfo[0])), 0, 0, 0, 0, 0, ) serialNumber := []byte{} for _, i := range cpuInfo { if i == 0 { break } serialNumber = append(serialNumber, byte(i&0xff)) serialNumber = append(serialNumber, byte((i>>8)&0xff)) } fmt.Println("CPU序列号:", string(serialNumber)) } ``` 这个代码片段通过`syscall`包中的`GetSystemInfo`函数获取系统信息,然后使用`GetVolumeInformationW`函数获取C盘的卷序列号。最终将卷序列号转换成字符串并打印出来。请注意,这个方法只适用于Windows操作系统。对于其他操作系统,需要使用不同的方法来获取CPU序列号。 ### 回答3: 在Golang获取CPU序列号可以通过使用一些系统库和函数来实现。以下是一种可能的方式: 首先,我们可以使用"syscall"包中的sysctl函数来获取与CPU相关的信息。sysctl函数可以通过查询系统指定的参数来获取这些信息。 接下来,我们需要使用"runtime"包中的GOMAXPROCS函数来获取当前系统上的CPU数量。 然后,我们可以使用C语言的代码来实现获取CPU序列号的功能。这可以通过在Go代码中使用"unsafe"和"C"包来实现。 具体代码如下: ```go package main import ( "fmt" "runtime" "syscall" "unsafe" ) const ( CTL_HW = 6 HW_MACHINE = 100 HW_MODEL = 107 ) func main() { var mib [2]int32 mib[0] = CTL_HW // 获取CPU序列号 mib[1] = HW_MODEL buf := make([]byte, 128) length := uint64(len(buf)) if syscall.Sysctl(mib[:], nil, &length, nil, 0) == nil { if length < 128 { if syscall.Sysctl(mib[:], buf, &length, nil, 0) == nil { fmt.Println("CPU序列号:", string(buf[:length-1])) } } } // 获取CPU核心数 fmt.Println("CPU 核心数:", runtime.GOMAXPROCS(0)) } ``` 这段代码首先使用sysctl函数获取CPU序列号并将其存储在缓冲区中。然后,通过调用runtime包中的GOMAXPROCS函数获取CPU核心数。最后,打印出获取的CPU序列号和CPU核心数。 请注意,由于涉及到操作系统底层的功能,代码的可移植性可能较差,可能在不同的操作系统上有不同的实现方式。因此,建议根据具体的操作系统进行适当的调整和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值