os.Symlink要求路径为绝对或相对,不能为空;源路径需存在且可读,目标路径不能已存在;硬链接os.Link不支持跨文件系统和目录;识别软链接需os.Lstat+IsSymlink+Readlink;Windows创建软链接需管理员权限或开发者模式。
os.Symlink 创建软链接时路径必须是相对或绝对的,不能是空字符串
调用
失败最常见的原因是源路径(
)为空、含非法字符,或目标路径(
)指向一个已存在的非空文件/目录。Go 不会自动覆盖,也不做路径规范化。
源路径
必须存在且可读(但创建时不要求目标已存在);它会被原样写入软链接文件内容,所以建议用绝对路径或相对于链接所在位置的相对路径
目标路径
是软链接自身的路径,必须是完整路径(如
),不能是相对路径如
—— 否则链接行为依赖当前工作目录,极易出错
如果
已存在,
直接返回
错误,需手动
或用
清理
硬链接在 Go 中无法跨文件系统,且不支持目录
Go 标准库没有提供创建硬链接的函数,因为
是唯一入口,但它底层调用的是 POSIX
系统调用——这意味着它天然受操作系统限制:不能跨设备(即跨文件系统),也不能对目录创建硬链接(Linux/macOS 均禁止,否则会破坏文件系统结构)。
的两个参数都必须是**已存在的普通文件**,且位于同一挂载点下(可通过
或
命令确认)
尝试对目录调用
会返回
(Linux)或
(macOS)
跨分区失败时错误通常是
,不是 Go 的 bug,是内核拒绝
判断链接类型得靠 os.Lstat + FileMode.IsRegular / IsDir + os.Readlink
仅仅用
会跟随软链接,拿到的是目标文件的信息;要识别链接本身,必须用
,再结合
、
和
组合判断。
返回链接自身的元信息;若
,说明是软链接
对软链接调用
才能拿到它指向的路径;若返回空字符串或错误,说明链接损坏或权限不足
硬链接无法直接识别——所有硬链接共享同一个 inode,
返回的
和普通文件完全一样,只能通过
的
查看硬链接数(但该字段非跨平台)
Windows 上 Symlink 需管理员权限或开发者模式开启
在 Windows 上,
默认会失败,报错
或
,因为 Windows 软链接(symbolic link)默认需要管理员权限创建,除非启用了“开发者模式”或使用
命令手动配置过策略。
go语言参考手册 中文CHM版
Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。本文给大家带来Go参考手册,需要的可以来下载! Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。 Go 语言特色 简洁、快速、安全 并行、有趣、开源 内存管理、v数组安全、编译
下载
立即学习
“
go语言免费学习笔记(深入)
”;
Go 1.16+ 在 Windows 上尝试创建软链接时,会先调用
API;失败后不会降级为 junction(目录硬链接),而是直接报错
普通用户可启用“开发者模式”(设置 → 更新与安全 → 开发者选项 → 开发者模式),之后无需管理员权限即可创建软链接
若仍需兼容旧环境,可用
调用系统命令,但需注意 shell 注入和路径转义
硬链接(
)在 Windows 上对应
,不需要管理员权限,但同样不支持目录,且要求源目标在同一卷。
os.Symlinkoldnamenewnameoldnamenewname/tmp/mylink./mylinknewnameos.Symlinkfile existsos.Removeos.RemoveAllerr := os.Symlink("/usr/local/bin/go", "/tmp/golink")
if err != nil {
log.Fatal(err) // 比如 "file exists" 或 "permission denied"
}os.Linklink(2)os.Linkstatfsdfos.Linkoperation not permittedoperation not supportedinvalid cross-device linkerr := os.Link("/home/user/file.txt", "/mnt/usb/file.txt") // 很可能失败
if err != nil {
fmt.Println(err) // 输出类似 "invalid cross-device link"
}os.Statos.LstatMode().IsRegular()IsDir()os.Readlinkos.Lstatfi.Mode()&os.ModeSymlink != 0os.Readlinkos.LstatMode()os.Statsys().(*syscall.Stat_t).Nlinkfi, _ := os.Lstat("/path/to/link")
if fi.Mode()&os.ModeSymlink != 0 {
target, _ := os.Readlink("/path/to/link")
fmt.Printf("soft link → %s\n", target)
}os.Symlinkoperation not supportedaccess is deniedmklinkCreateSymbolicLinkexec.Command("cmd", "/c", "mklink", ...)os.LinkCreateHardLink