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)
}
}

更多关于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 build 和 go 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 run 和 go 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 生成可执行文件在当前环境运行,这可能导致文件系统访问、权限和环境配置的差异。建议添加完整的错误处理来诊断具体问题。

