Golang中go build和go run的执行结果为什么会不同

Golang中go build和go run的执行结果为什么会不同

package main

import (
   "fmt"
   "time"
   "strconv"
   "syscall"
   "io/ioutil"
)

func del_old7days(){
	currentTime := time.Now()
	oldTime := currentTime.AddDate(0, 0, -2)	
	timestr := oldTime.Format("2006-01-02/15:04:05")
	fmt.Println(timestr)
}
func GetLogicalDrives() []string {
    kernel32 := syscall.MustLoadDLL("kernel32.dll")
    GetLogicalDrives := kernel32.MustFindProc("GetLogicalDrives")
    n, _, _ := GetLogicalDrives.Call()
    s := strconv.FormatInt(int64(n), 2)
 
    var drives_all = []string{"A:", "B:", "C:", "D:", "E:", "F:", "G:", "H:", "I:", "J:", "K:", "L:", "M:", "N:", "O:", "P:", "Q:", "R:", "S:", "T:", "U:", "V:", "W:", "X:", "Y:", "Z:"}
    temp := drives_all[0:len(s)]
 
    var d []string
    for i, v := range s {
 
        if v == 49 {
            l := len(s) - i - 1
            d = append(d, temp[l])
        }
    }
    var drives []string
    for i, v := range d {
        drives = append(drives[i:], append([]string{v}, drives[:i]...)...)
    }
    return drives
 
}
func all_disk_path(path string){
	files,_:= ioutil.ReadDir(path)
	for _, file := range files {	
       if file.IsDir() {   	
		all_disk_path(path+"/"+file.Name())
	   } else {
	     fmt.Println(path+"/"+file.Name())
		 time.Sleep(time.Second)
	   }
	}
}
func main(){
	data :=GetLogicalDrives()
 	for _,value :=range data{
	
		all_disk_path(value)
	}
}

image


更多关于Golang中go build和go run的执行结果为什么会不同的实战教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

谢谢你,C:/是正确的

更多关于Golang中go build和go run的执行结果为什么会不同的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


非常感谢

这些 q3q 文件是从哪里来的?这是某种恶意软件吗?

请将你的 Go 代码放在两行之间,一行是 go,另一行是(反引号),这样帖子中的代码就会以 Go 代码格式显示。这样其他人阅读起来会容易得多。

你好

C: 并不是C盘根目录的路径。C:\才是正确的路径。使用io.ReadDir请求C:下的所有文件只会返回当前目录中的文件(至少对我来说是这样)。

连接路径应该使用filepath.Join(),这样你就能在Linux和macOS上获得正确的分隔符/,在Windows上获得\。

希望这对你有所帮助。

go buildgo run 的执行结果不同通常是由于程序逻辑本身的问题,特别是涉及并发、文件系统操作或系统调用时的行为差异。从你的代码来看,问题可能出现在以下几个方面:

1. 系统调用和平台依赖

你的代码使用了 Windows 系统调用 GetLogicalDrives,这在不同执行环境下可能有不同表现:

func GetLogicalDrives() []string {
    kernel32 := syscall.MustLoadDLL("kernel32.dll")
    GetLogicalDrives := kernel32.MustFindProc("GetLogicalDrives")
    n, _, _ := GetLogicalDrives.Call()
    // 这里需要检查错误,但被忽略了
    s := strconv.FormatInt(int64(n), 2)
    
    // 后续逻辑可能在不同环境下产生不同结果
}

2. 文件系统遍历的差异

all_disk_path 函数递归遍历文件系统,在不同执行环境下可能遇到不同的文件权限或路径结构:

func all_disk_path(path string){
    files,_:= ioutil.ReadDir(path) // 错误被忽略
    for _, file := range files {    
        if file.IsDir() {        
            all_disk_path(path+"/"+file.Name())
        } else {
            fmt.Println(path+"/"+file.Name())
            time.Sleep(time.Second) // 这会导致执行时间差异
        }
    }
}

3. 具体差异分析

从你的截图看,go rungo build 的主要差异可能包括:

  • 文件系统访问权限:编译后的可执行文件可能以不同权限运行
  • 工作目录差异go run 在临时目录执行,编译后的程序在当前目录执行
  • 环境变量:执行环境可能不同
  • 错误处理缺失:代码中多处忽略了错误返回值

4. 改进的代码示例

package main

import (
    "fmt"
    "log"
    "os"
    "path/filepath"
    "time"
)

// 更可靠的文件遍历方式
func walkDiskPath(path string) error {
    return filepath.Walk(path, func(filePath string, info os.FileInfo, err error) error {
        if err != nil {
            // 记录错误但继续执行
            log.Printf("访问路径 %s 失败: %v", filePath, err)
            return nil
        }
        
        if !info.IsDir() {
            fmt.Println(filePath)
            time.Sleep(time.Millisecond * 100) // 减少延迟
        }
        return nil
    })
}

func main() {
    // 使用跨平台的方式获取可用驱动器
    roots := []string{"/"} // Unix-like 系统
    if len(os.Args) > 1 {
        roots = os.Args[1:]
    }
    
    for _, root := range roots {
        if _, err := os.Stat(root); err == nil {
            if err := walkDiskPath(root); err != nil {
                log.Printf("遍历 %s 失败: %v", root, err)
            }
        }
    }
}

go run 在临时目录编译并立即执行,而 go build 生成可执行文件在当前环境运行,这可能导致文件系统访问、权限和环境配置的差异。建议添加完整的错误处理来诊断具体问题。

回到顶部