path/filepath

filepath 包提供对文件路径的操作,兼容不同的操作系统

网站查询:
filepath使用方法
本地查询方法:

  1. # 如果官网访问不了或时间太长可以查看本地的标准库 与官网没什么区别。只不过官网更直观而已
  2. ligz@DESKTOP-911J8B9 MINGW64 /d/projects
  3. # 查看filepath下面的方法及filepath的说明
  4. $ go doc path/filepath
  5. package filepath // import "path/filepath"
  6. Package filepath implements utility routines for manipulating filename paths
  7. in a way compatible with the target operating system-defined file paths.
  8. The filepath package uses either forward slashes or backslashes, depending
  9. on the operating system. To process paths such as URLs that always use
  10. forward slashes regardless of the operating system, see the path package.
  11. const Separator = os.PathSeparator ...
  12. var ErrBadPattern = errors.New("syntax error in pattern")
  13. var SkipDir error = fs.SkipDir
  14. func Abs(path string) (string, error)
  15. func Base(path string) string
  16. func Clean(path string) string
  17. func Dir(path string) string
  18. func EvalSymlinks(path string) (string, error)
  19. func Ext(path string) string
  20. func FromSlash(path string) string
  21. func Glob(pattern string) (matches []string, err error)
  22. func HasPrefix(p, prefix string) bool
  23. func IsAbs(path string) (b bool)
  24. func Join(elem ...string) string
  25. func Match(pattern, name string) (matched bool, err error)
  26. func Rel(basepath, targpath string) (string, error)
  27. func Split(path string) (dir, file string)
  28. func SplitList(path string) []string
  29. func ToSlash(path string) string
  30. func VolumeName(path string) string
  31. func Walk(root string, fn WalkFunc) error
  32. func WalkDir(root string, fn fs.WalkDirFunc) error
  33. type WalkFunc func(path string, info fs.FileInfo, err error) error
  34. ligz@DESKTOP-911J8B9 MINGW64 /d/projects
  35. # 查看Abs详细用法及说明
  36. $ go doc path/filepath Abs
  37. package filepath // import "path/filepath"
  38. func Abs(path string) (string, error)
  39. Abs returns an absolute representation of path. If the path is not absolute
  40. it will be joined with the current working directory to turn it into an
  41. absolute path. The absolute path name for a given file is not guaranteed to
  42. be unique. Abs calls Clean on the result.

常用的函数:

  • Abs: 绝对路径
  • Base:文件名
  • Clean:清除文件路径中.、..等字符
  • Dir: 文件目录
  • Ext:获取文件后缀
  • FromSlash:格式化路径分隔符(\t)
  • ToSlash:格式化路径分隔符(/)
  • Glob:获取匹配格式的文件路径切片
  • IsAbs:判断是否为绝对路径
  • Json: 链接路径
  • Match:判断路径是否匹配
  • Split:分割文件目录和文件名
  • SplitList: 分割路径分隔符(冒号或分号)连接的文件路径
  • Walk: 遍历目录中文件(子孙)

    实操

    说明: 实操代码贴入2个文件代码,一个文件是演示代码本身,另外一个文件是运行时的测试代码,如果是新手建议使用goland,配置简单容易上手,如不做特殊说明 这些文件都处于同一个目录中

  1. $ ll learnFilePath/
  2. total 5
  3. -rw-r--r-- 1 ligz 197121 1285 Aug 25 22:49 learnFilePath.go
  4. -rw-r--r-- 1 ligz 197121 94 Aug 25 22:35 learnFilePath_test.go

learnFilePath.go

  1. package learnFilePath
  2. import (
  3. "fmt"
  4. "io/fs"
  5. "os"
  6. "path/filepath"
  7. )
  8. func BasicFilePath() {
  9. // 绝对路径
  10. fmt.Println(filepath.Abs("."))
  11. // 是否绝对路径
  12. fmt.Println(filepath.IsAbs("."))
  13. // 可执行文件返回启动当前进程的可执行文件的路径名
  14. exe, _ := os.Executable()
  15. fmt.Println(filepath.IsAbs(exe))
  16. // 目录
  17. fmt.Println(filepath.Dir(exe))
  18. fmt.Println(filepath.Base(exe))
  19. fmt.Println(filepath.Split(exe))
  20. fmt.Println(filepath.Ext(exe))
  21. fmt.Println(filepath.FromSlash(exe))
  22. fmt.Println(filepath.FromSlash("D:/projects/golangLearn/basicproject/learnFilePath"))
  23. fmt.Println(filepath.ToSlash(exe))
  24. fmt.Println(filepath.ToSlash("D:\\projects\\golangLearn\\basicproject\\learnFilePath"))
  25. fmt.Println(filepath.Glob("c:\\Users\\ligz\\Downloads\\*.pdf"))
  26. fmt.Println(filepath.Match("D:\\*\\learnFilePath\\*.go", "D:\\projects\\golangLearn\\basicproject\\learnFilePath\\learnFilePath.go"))
  27. fmt.Println(filepath.Join("d:\\", "projects", "test.go"))
  28. fmt.Println(filepath.SplitList(os.Getenv("PATH")))
  29. // 遍历目录中的文件
  30. filepath.Walk("d:\\projects", func(path string, info fs.FileInfo, err error) error {
  31. if info.IsDir() && info.Name() != "projects" {
  32. return filepath.SkipDir
  33. }
  34. fmt.Println(path)
  35. return nil
  36. })
  37. }

learnFilePath_test.go

  1. package learnFilePath
  2. import "testing"
  3. func TestFilePath(t *testing.T) {
  4. BasicFilePath()
  5. }

执行结果

  1. GOROOT=C:\Program Files\Go #gosetup
  2. GOPATH=C:\Users\ligz\go #gosetup
  3. "C:\Program Files\Go\bin\go.exe" test -c -o C:\Users\ligz\AppData\Local\Temp\GoLand\___basicproject_learnFilePath__TestFilePath.test.exe basicproject/learnFilePath #gosetup
  4. "C:\Program Files\Go\bin\go.exe" tool test2json -t C:\Users\ligz\AppData\Local\Temp\GoLand\___basicproject_learnFilePath__TestFilePath.test.exe -test.v -test.paniconexit0 -test.run ^\QTestFilePath\E$ #gosetup
  5. === RUN TestFilePath
  6. D:\projects\golangLearn\basicproject\learnFilePath <nil>
  7. false
  8. true
  9. C:\Users\ligz\AppData\Local\Temp\GoLand
  10. ___basicproject_learnFilePath__TestFilePath.test.exe
  11. C:\Users\ligz\AppData\Local\Temp\GoLand\ ___basicproject_learnFilePath__TestFilePath.test.exe
  12. .exe
  13. C:\Users\ligz\AppData\Local\Temp\GoLand\___basicproject_learnFilePath__TestFilePath.test.exe
  14. D:\projects\golangLearn\basicproject\learnFilePath
  15. C:/Users/ligz/AppData/Local/Temp/GoLand/___basicproject_learnFilePath__TestFilePath.test.exe
  16. D:/projects/golangLearn/basicproject/learnFilePath
  17. [c:\Users\ligz\Downloads\gorm-210111075400.pdf c:\Users\ligz\Downloads\上课环境须知.pdf] <nil>
  18. false <nil>
  19. d:\projects\test.go
  20. [C:\Windows\system32 C:\Windows C:\Windows\System32\Wbem C:\Windows\System32\WindowsPowerShell\v1.0\ C:\Windows\System32\OpenSSH\ C:\Program Files\Go\bin C:\Program Files\Git\cmd C:\Users\ligz\AppData\Local\Microsoft\WindowsApps C:\Users\ligz\AppData\Local\Programs\Microsoft VS Code\bin C:\Users\ligz\go\bin C:\Program Files\Go\bin]
  21. d:\projects
  22. --- PASS: TestFilePath (0.00s)
  23. PASS
  24. 进程 已完成,退出代码为 0

os

os包 提供了对文件、系统和进程的操作函数

网站查询:
os使用方法
本地查询方法:

  1. ~ go doc os

文件操作

常用的常量

  • Stdin 标准输入
  • Stdout 标准输出
  • Stderr 标准错误
  • ModePerm: 0777 默认内置常量权限码 值是0777 最大权限

    常用的函数

  • Chmod: 修改文件权限

  • Chown: 修改文件所属用户、用户组
  • Chtimes: 修改文件访问时间和修改时间
  • IsExist: 与os.Stat 一起用于判断文件存在
  • IsNotExit: 与os.Stat 一起用于判断文件不存在
  • Link: 创建软连接
  • Mkdir: 创建文件夹
  • MkdirAll: 创建文件夹(父目录或多层目录不存在则逐层创建 相当于linux下mkdir -p)
  • Remove: 移除文件或空文件夹
  • Remove: 移除所有文件
  • Rename: 重命名

    实操

    learnOs.go

    ```go package learnOs

import ( “fmt” “os” “time” )

func BasicLearnOS() { // 创建多层目录,并指定最高权限777 这个可以自己手写755 600等数字 fmt.Println(os.Mkdir(“test/test01/test02”, os.ModePerm)) fmt.Println(os.Mkdir(“test02”, 0755)) fmt.Println(os.MkdirAll(“test/test01/test02”, os.ModePerm))

  1. fmt.Println(os.Rename("test", "test03"))
  2. fmt.Println(os.Rename("test02", "test04"))
  3. time.Sleep(3 * time.Second) // 暂停3秒钟
  4. fmt.Println(os.Remove("test04"))
  5. fmt.Println(os.Remove("test03"))
  6. fmt.Println(os.RemoveAll("test03"))

}

  1. <a name="1zLxy"></a>
  2. #### learnOs_test
  3. ```go
  4. package learnOs
  5. import "testing"
  6. func TestBasicLearnOS(t *testing.T) {
  7. BasicLearnOS()
  8. }

结果

  1. GOROOT=C:\Program Files\Go #gosetup
  2. GOPATH=C:\Users\ligz\go #gosetup
  3. "C:\Program Files\Go\bin\go.exe" test -c -o C:\Users\ligz\AppData\Local\Temp\GoLand\___basicproject_learnOs__TestBasicLearnOS.test.exe basicproject/learnOs #gosetup
  4. "C:\Program Files\Go\bin\go.exe" tool test2json -t C:\Users\ligz\AppData\Local\Temp\GoLand\___basicproject_learnOs__TestBasicLearnOS.test.exe -test.v -test.paniconexit0 -test.run ^\QTestBasicLearnOS\E$ #gosetup
  5. === RUN TestBasicLearnOS
  6. mkdir test/test01/test02: The system cannot find the path specified.
  7. <nil>
  8. <nil>
  9. <nil>
  10. <nil>
  11. <nil>
  12. remove test03: The directory is not empty.
  13. <nil>
  14. --- PASS: TestBasicLearnOS (3.01s)
  15. PASS
  16. 进程 已完成,退出代码为 0

常用结构体

File 对文件操作

常用函数

  • Create: 创建文件并返回文件对象指针(文件不存在则创建,文件存在则清空)
  • Open: 打开文件并返回文件对象指针
  • OpenFile:按指定权限打开文件,并返回文件指针对象

常用方法

  • Read: 读取文件到字节切片
  • Write: 写入字节切片到文件
  • WriteString: 写入字符串到文件
  • Readdir:获取目录下所有文件信息
  • Readdirnames: 获取目录下所有文件名
  • Seek: 设置文件指针位置
  • Stat: 获取文件状态信息
  • Sync: 同步文件到硬盘
  • Close: 关闭文件

实操
learnFile.go

  1. package learnFile
  2. import (
  3. "fmt"
  4. "io"
  5. "os"
  6. )
  7. func LearnFile() {
  8. f01, err := os.Create("t01.txt")
  9. if err != nil {
  10. defer func() {
  11. _ = f01.Close()
  12. }()
  13. fmt.Printf("os create err: %v\n", err)
  14. }
  15. n, err := f01.WriteString("我是输入内容")
  16. fmt.Printf("错误 err: %v\n", err)
  17. fmt.Printf("影响行数 [%d]\n", n)
  18. f02, err := os.Open("t01.txt")
  19. if err != nil {
  20. defer func() {
  21. _= f02.Close()
  22. }()
  23. }
  24. var r = make([]byte, 3)
  25. for {
  26. n, err := f02.Read(r)
  27. if err != nil {
  28. if err == io.EOF{
  29. break
  30. }
  31. fmt.Printf("read file err: %v\n", err)
  32. }
  33. fmt.Printf("内容: %v\n", string(r[:n]))
  34. }
  35. }
  36. func LearnFileSet() {
  37. f01, err := os.Create("t02.txt")
  38. if err != nil {
  39. defer func() {
  40. _ = f01.Close()
  41. }()
  42. }
  43. n1, err := f01.WriteString("aaaaa")
  44. if err != nil {
  45. fmt.Printf("write string err: %v\n", err)
  46. }
  47. fmt.Printf("写入内容长度: %d\n", n1)
  48. var r = make([]byte, 30)
  49. ret, err := f01.Seek(0, 0)
  50. fmt.Printf("ret: %v err: %v\n", ret, err)
  51. for {
  52. n, err := f01.Read(r)
  53. if err != nil {
  54. if err == io.EOF{
  55. break
  56. }
  57. fmt.Printf("read file err: %v\n", err)
  58. }
  59. fmt.Printf("读取到的数据: %s\n", string(r[0:n]))
  60. }
  61. }
  62. func LearnFileOpenErr() {
  63. f04, err := os.Open("test.txt")
  64. if err != nil {
  65. defer func() {
  66. _ = f04.Close()
  67. }()
  68. fmt.Printf("错误信息: %v\n", err)
  69. }
  70. n, err := f04.WriteString("init error!")
  71. if err != nil {
  72. fmt.Printf("warit string error err: %v\n", err)
  73. }
  74. fmt.Printf("n:[%v]\n", n)
  75. }
  76. func LearnOpenFIle() {
  77. f05, err := os.OpenFile("t03.txt", os.O_CREATE|os.O_APPEND|os.O_RDWR, os.ModePerm)
  78. if err != nil {
  79. defer func() {
  80. _ = f05.Close()
  81. }()
  82. fmt.Printf("openfile err: %v\n", err)
  83. }
  84. n, err := f05.WriteString("我是使用os.OpenFile方式写入的")
  85. if err != nil {
  86. fmt.Printf("write string error err: %v\n", err)
  87. }
  88. fmt.Printf("insert number: %d\n", n)
  89. }
  90. func LearnOpenFileOnlyRead() {
  91. f06, err := os.OpenFile("t03.txt", os.O_RDONLY, os.ModePerm)
  92. if err != nil {
  93. defer func() {
  94. _ = f06.Close()
  95. }()
  96. fmt.Printf("openfile err: %v\n", err)
  97. }
  98. r := make([]byte, 3)
  99. for {
  100. n, err := f06.Read(r)
  101. if err != nil {
  102. if err == io.EOF{
  103. break
  104. }
  105. fmt.Printf("read file error err: %v\n", err)
  106. }
  107. fmt.Printf("读取到的内容: %s\n", string(r[0:n]))
  108. }
  109. }

learnFile_test.go

  1. package learnFile
  2. import "testing"
  3. func TestLearnFile(t *testing.T) {
  4. LearnFile()
  5. }
  6. func TestLearnFileSet(t *testing.T) {
  7. LearnFileSet()
  8. }
  9. func TestLearnFileOpenErr(t *testing.T) {
  10. LearnFileOpenErr()
  11. }
  12. func TestLearnOpenFIle(t *testing.T) {
  13. LearnOpenFIle()
  14. }
  15. func TestLearnOpenFileOnlyRead(t *testing.T) {
  16. LearnOpenFileOnlyRead()
  17. }

FileInfo 文件状态信息

常用函数

  • Lstat: 获取文件路径文件信息(对于链接返回连接文件信息)
  • State:获取文件路径文件信息(对于链接返回连接到的文件的信息)、

常用方法

  • Name: 获取文件名
  • Size:获取文件大小
  • Mode: 获取文件模式
  • ModTime: 获取修改时间
  • IsDir: 判断是否为文件夹

    FileMode 文件模式

    常用方法

  • IsDir: 判断是否为文件夹

系统操作

常用 函数

  • Environ: 获取环境变量切片
  • Setenv:设置环境变量
  • Getenv: 获取环境变量
  • LookupEnv:获取环境变量
  • Unsetenv:清楚环境变量
  • Clearenv:清空环境变量
  • Executable:获取当前执行文件路径
  • Hostname:获取文件名
  • TempDir:获取用户home目录
  • UserHomeDir:获取用户home目录
  • UserCacheDir:获取用户缓存目录

    实操

    learnSystem.go

    ```go package learnSystem

import ( “fmt” “os” )

func LearnSystem() { fmt.Println(os.Executable()) fmt.Println(os.Environ()) fmt.Println(os.Getenv(“PATH”)) fmt.Println(os.Getenv(“DEBUG”)) fmt.Println(os.LookupEnv(“DEBUG”))

  1. fmt.Println(os.Setenv("DEBUG", "True"))
  2. fmt.Println(os.LookupEnv("DEBUG"))
  3. fmt.Println(os.Unsetenv("DEBUG"))
  4. fmt.Println(os.LookupEnv("DEBUG"))
  5. os.Clearenv()
  6. fmt.Println(os.Environ())
  7. fmt.Println(os.Hostname())
  8. fmt.Println(os.TempDir())
  9. fmt.Println(os.UserHomeDir())
  10. fmt.Println(os.UserConfigDir())
  11. fmt.Println(os.UserCacheDir())

}

  1. <a name="ZAcpg"></a>
  2. #### learnSystem_test.go
  3. ```go
  4. package learnSystem
  5. import "testing"
  6. func TestLearnSystem(t *testing.T) {
  7. LearnSystem()
  8. }

执行结果

  1. === RUN TestLearnSystem
  2. C:\Users\ligz\AppData\Local\Temp\GoLand\___basicproject_learnSystem__TestLearnSystem.test.exe <nil>
  3. [=::=::\ ALLUSERSPROFILE=C:\ProgramData APPDATA=C:\Users\ligz\AppData\Roaming AR=ar CC=gcc CGO_ENABLED=1 CommonProgramFiles=C:\Program Files\Common Files CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files CommonProgramW6432=C:\Program Files\Common Files COMPUTERNAME=DESKTOP-911J8B9 ComSpec=C:\Windows\system32\cmd.exe CXX=g++ DriverData=C:\Windows\System32\Drivers\DriverData FPS_BROWSER_APP_PROFILE_STRING=Internet Explorer FPS_BROWSER_USER_PROFILE_STRING=Default GCCGO=gccgo GO111MODULE=on GOARCH=amd64 GOCACHE=C:\Users\ligz\AppData\Local\go-build GOENV=C:\Users\ligz\AppData\Roaming\go\env GOEXE=.exe GOHOSTARCH=amd64 GOHOSTOS=windows GOMODCACHE=C:\Users\ligz\go\pkg\mod GONOPROXY=https://goproxy.cn GOOS=windows GOPATH=C:\Users\ligz\go GOPROXY=https://goproxy.cn,https://goproxy.io GOROOT=C:\Program Files\Go GOSUMDB=sum.golang.org GOTOOLDIR=C:\Program Files\Go\pkg\tool\windows_amd64 GOVERSION=go1.16.7 HOMEDRIVE=C: HOMEPATH=\Users\ligz IDEA_INITIAL_DIRECTORY=C:\Users\ligz\Desktop LOCALAPPDATA=C:\Users\ligz\AppData\Local LOGONSERVER=\\DESKTOP-911J8B9 NUMBER_OF_PROCESSORS=12 OneDrive=C:\Users\ligz\OneDrive OS=Windows_NT Path=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files\Go\bin;C:\Program Files\Git\cmd;C:\Users\ligz\AppData\Local\Microsoft\WindowsApps;;C:\Users\ligz\AppData\Local\Programs\Microsoft VS Code\bin;C:\Users\ligz\go\bin;C:\Program Files\Go\bin PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC PROCESSOR_ARCHITECTURE=AMD64 PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 165 Stepping 3, GenuineIntel PROCESSOR_LEVEL=6 PROCESSOR_REVISION=a503 ProgramData=C:\ProgramData ProgramFiles=C:\Program Files ProgramFiles(x86)=C:\Program Files (x86) ProgramW6432=C:\Program Files PSModulePath=C:\Program Files\WindowsPowerShell\Modules;C:\Windows\system32\WindowsPowerShell\v1.0\Modules PUBLIC=C:\Users\Public SESSIONNAME=Console SystemDrive=C: SystemRoot=C:\Windows TEMP=C:\Users\ligz\AppData\Local\Temp TMP=C:\Users\ligz\AppData\Local\Temp USERDOMAIN=DESKTOP-911J8B9 USERDOMAIN_ROAMINGPROFILE=DESKTOP-911J8B9 USERNAME=ligz USERPROFILE=C:\Users\ligz windir=C:\Windows WXDRIVE_START_ARGS=--wxdrive-setting=0 --disable-gpu --disable-software-rasterizer --enable-features=NetworkServiceInProcess]
  4. C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files\Go\bin;C:\Program Files\Git\cmd;C:\Users\ligz\AppData\Local\Microsoft\WindowsApps;;C:\Users\ligz\AppData\Local\Programs\Microsoft VS Code\bin;C:\Users\ligz\go\bin;C:\Program Files\Go\bin
  5. false
  6. <nil>
  7. True true
  8. <nil>
  9. false
  10. []
  11. DESKTOP-911J8B9 <nil>
  12. C:\Windows
  13. %userprofile% is not defined
  14. %AppData% is not defined
  15. %LocalAppData% is not defined
  16. --- PASS: TestLearnSystem (0.00s)
  17. PASS
  18. 进程 已完成,退出代码为 0

进程操作

常用常量

  • Args:获取命令行参数

    常用函数

  • Getuid: 获取进程所属用户ID

  • Getid: 获取进程所属用户组ID
  • Getpid: 获取当前进程id
  • Getppid: 获取父进程ID
  • Getwd:获取工作目录
  • Chdir: 修改当前工作目录
  • Exit:退出程序

    实操

    learnSystem.go

    ```go package learnSystem

import ( “fmt” “os” )

func LearnProc() { fmt.Println(len(os.Args), os.Args)

  1. fmt.Println(os.Getuid(), os.Getgid(), os.Geteuid())
  2. fmt.Println(os.Getpid(), os.Getppid())
  3. fmt.Println(os.Getwd())
  4. fmt.Println(os.Chdir("d:\\"))
  5. fmt.Println(os.Getwd())

}

  1. <a name="MY8b0"></a>
  2. #### learnSystem_test.go
  3. ```go
  4. package learnSystem
  5. import "testing"
  6. func TestLearnProc(t *testing.T) {
  7. LearnProc()
  8. }

执行结果

  1. API server listening at: 127.0.0.1:51564
  2. === RUN TestLearnProc
  3. 5 [C:\Users\ligz\AppData\Local\Temp\GoLand\___basicproject_learnSystem__TestLearnProc.test.exe -test.v -test.paniconexit0 -test.run ^\QTestLearnProc\E$]
  4. -1 -1 -1
  5. 9512 2708
  6. D:\projects\golangLearn\basicproject\learnSystem <nil>
  7. <nil>
  8. d:\ <nil>
  9. --- PASS: TestLearnProc (0.00s)
  10. PASS
  11. 调试器 已完成,退出代码为 0

常用结构体

  • Process

常用方法

  • FindProcess: 根据进程id查找进程对象指针
  • StartProcess:启动进程
  • Kill: 杀死进程
  • Release:释放进程资源信息
  • Signal:发送信息给进程
  • Wait: 等待进程退出,并返回进程状态信息指针
    • ProcessState

常用方法

  • ExitCode: 退出状态码
  • Exited: 是否已经退出
  • Pid:进程id
  • Success: 是否成功退出
  • SystemTime: 内核态执行时间
  • UserTime: 用户态执行时间

    实操

    learnSystem.go

    ```go package learnSystem

import ( “fmt” “os” “time” )

func LearnProcess(){ process, _ := os.FindProcess(os.Getppid()) fmt.Printf(“process: %T,%+v\n”, process, process)

  1. attr := &os.ProcAttr{
  2. Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},
  3. }
  4. sprocess, err := os.StartProcess("E:\\GoLand 2021.2.1\\bin\\goland64.exe", []string{}, attr)
  5. fmt.Println(sprocess, err)
  6. fmt.Println("--------------------")
  7. // 15秒后kill进程
  8. go func() {
  9. time.Sleep(15 * time.Second)
  10. sprocess.Kill()
  11. }()
  12. state, err := sprocess.Wait() // 等待进程结束
  13. if err == nil {
  14. fmt.Println(state.ExitCode())
  15. fmt.Println(state.Exited())
  16. fmt.Println(state.Pid())
  17. fmt.Println(state.Success())
  18. fmt.Println(state.Sys())
  19. fmt.Println(state.SysUsage())
  20. fmt.Println(state.SystemTime())
  21. fmt.Println(state.UserTime())
  22. if err := sprocess.Release(); err != nil {
  23. fmt.Println(err)
  24. } // 释放进程资源信息
  25. } else {
  26. fmt.Println(err)
  27. }

}

  1. <a name="CWxYE"></a>
  2. #### learnSystem_test.go
  3. ```go
  4. package learnSystem
  5. import (
  6. "testing"
  7. )
  8. func TestLearnProcess(t *testing.T) {
  9. LearnProcess()
  10. }

执行结果

  1. === RUN TestLearnProcess
  2. process: *os.Process,&{Pid:7700 handle:308 isdone:0 sigMu:{w:{state:0 sema:0} writerSem:0 readerSem:0 readerCount:0 readerWait:0}}
  3. &{9596 332 0 {{0 0} 0 0 0 0}} <nil>
  4. --------------------
  5. 0
  6. true
  7. 9596
  8. true
  9. {0}
  10. &{{234177826 30907116} {234284835 30907116} {0 0} {0 0}}
  11. 0s
  12. 0s
  13. invalid argument
  14. --- PASS: TestLearnProcess (0.04s)
  15. PASS
  16. 进程 已完成,退出代码为 0

os/exec

exec包提供了启动一个外部进程并使用标准输入和输出进行通信

常用函数

  • LookPath: 查找程序所在路径

    常用结构体

  • Cmd: 执行命令

常用函数

  • Command

常用方法

  • Output: 执行并获取标准输出结果
  • Run: 执行命令
  • Start: 启动命令
  • Wait: 与Start 一起使用等待命令结束
  • StdoutPipe: 输出管道
  • StdinPipe: 输入管道

    实操

    learnExec

    ```go package learnSystem

import ( “encoding/json” “fmt” “io” “os” “os/exec” )

func LearnExec() { // 查找程序所在的路径 fmt.Println(“查找程序所在的路径”) fmt.Println(exec.LookPath(“语雀.exe”))

  1. // 执行命令获取命令执行后的结果
  2. fmt.Println("执行命令获取命令执行后的结果")
  3. cmd := exec.Command("ping", "-n", "3", "www.taobao.com")
  4. fmt.Printf("%+v\n", cmd)
  5. output, _ := cmd.Output()
  6. fmt.Println(string(output))
  7. // 执行命令
  8. fmt.Println("执行命令")
  9. cmd = exec.Command("ping", "-n", "5", "www.taobao.com")
  10. fmt.Println(cmd.Path, cmd.Args)
  11. fmt.Println(cmd.Run())
  12. // 执行命令通过管道获取结果
  13. fmt.Println("执行命令通过管道获取结果")
  14. cmd = exec.Command("ping", "-n", "5", "www.taobao.com")
  15. stdout, _ := cmd.StdoutPipe()
  16. fmt.Println(cmd.Path, cmd.Args)
  17. fmt.Println(cmd.Start())
  18. water, err := io.Copy(os.Stdout, stdout)
  19. fmt.Println("err:", err, "wter", water)
  20. fmt.Println(cmd.Wait())
  21. // 执行命令, 使用管道获取结果并输入给Json Decoder
  22. fmt.Println("执行命令, 使用管道获取结果并输入给Json Decoder")
  23. user := make(map[string]string)
  24. cmd = exec.Command("C:\\Program Files\\Git\\usr\\bin\\echo", `{"name": "ligz"}`)
  25. stdout, _ = cmd.StdoutPipe()
  26. cmd.Start()
  27. json.NewDecoder(stdout).Decode(&user)
  28. cmd.Wait()
  29. fmt.Printf("%+v\n", user)
  30. // 执行命令, 使用管道连接多个执行命令
  31. fmt.Println("执行命令, 使用管道连接多个执行命令")
  32. cmd01 := exec.Command("C:\\Program Files\\Git\\usr\\bin\\echo", `{"name":"ligz"}`)
  33. cmd02 := exec.Command("c:\\Users\\ligz\\AppData\\Local\\Programs\\Python\\Python39\\python", "-m", "json.tool")
  34. stdout01, _ := cmd01.StdoutPipe()
  35. cmd02.Stdin = stdout01
  36. stdout02, _ := cmd02.StdoutPipe()
  37. fmt.Println(cmd01.Start())
  38. fmt.Println(cmd02.Start())
  39. fmt.Println(cmd01.Wait())
  40. io.Copy(os.Stdout, stdout02)
  41. fmt.Println(cmd02.Wait())

}

  1. <a name="Okbwg"></a>
  2. #### learnExec_test.go
  3. ```go
  4. package learnSystem
  5. import "testing"
  6. func TestLearnExec(t *testing.T) {
  7. LearnExec()
  8. }

执行结果

  1. === RUN TestLearnExec
  2. 查找程序所在的路径
  3. exec: "语雀.exe": executable file not found in %PATH%
  4. 执行命令获取命令执行后的结果
  5. C:\Windows\system32\ping.exe -n 3 www.taobao.com
  6. ���� Ping www.taobao.com.danuoyi.tbcache.com [124.200.113.166] ���� 32 �ֽڵ�����:
  7. ���� 124.200.113.166 �Ļظ�: �ֽ�=32 ʱ��=3ms TTL=58
  8. ���� 124.200.113.166 �Ļظ�: �ֽ�=32 ʱ��=3ms TTL=58
  9. ���� 124.200.113.166 �Ļظ�: �ֽ�=32 ʱ��=4ms TTL=58
  10. 124.200.113.166 �� Ping ͳ����Ϣ:
  11. ���ݰ�: �ѷ��� = 3���ѽ��� = 3����ʧ = 0 (0% ��ʧ)��
  12. �����г̵Ĺ���ʱ��(�Ժ���Ϊ��λ):
  13. ���� = 3ms��� = 4ms��ƽ�� = 3ms
  14. 执行命令
  15. C:\Windows\system32\ping.exe [ping -n 5 www.taobao.com]
  16. <nil>
  17. 执行命令通过管道获取结果
  18. C:\Windows\system32\ping.exe [ping -n 5 www.taobao.com]
  19. <nil>
  20. ���� Ping www.taobao.com.danuoyi.tbcache.com [124.200.113.166] ���� 32 �ֽڵ�����:
  21. ���� 124.200.113.166 �Ļظ�: �ֽ�=32 ʱ��=3ms TTL=58
  22. ���� 124.200.113.166 �Ļظ�: �ֽ�=32 ʱ��=3ms TTL=58
  23. ���� 124.200.113.166 �Ļظ�: �ֽ�=32 ʱ��=3ms TTL=58
  24. ���� 124.200.113.166 �Ļظ�: �ֽ�=32 ʱ��=3ms TTL=58
  25. ���� 124.200.113.166 �Ļظ�: �ֽ�=32 ʱ��=3ms TTL=58
  26. 124.200.113.166 �� Ping ͳ����Ϣ:
  27. ���ݰ�: �ѷ��� = 5���ѽ��� = 5����ʧ = 0 (0% ��ʧ)��
  28. �����г̵Ĺ���ʱ��(�Ժ���Ϊ��λ):
  29. ���� = 3ms��� = 3ms��ƽ�� = 3ms
  30. err: <nil> wter 526
  31. <nil>
  32. 执行命令, 使用管道获取结果并输入给Json Decoder
  33. map[name:ligz]
  34. 执行命令, 使用管道连接多个执行命令
  35. <nil>
  36. <nil>
  37. <nil>
  38. exit status 1
  39. --- PASS: TestLearnExec (10.27s)
  40. PASS
  41. 进程 已完成,退出代码为 0

fmt

fmt包提供输入和输出功能

常用函数

错误类型

  • Errorf:创建error类型

    输出到数据流

  • Fprint: 将数据输出到输出流中,不添加换行

  • Fprintf: 将数据输出到按照一定格式输出到输出流中
  • Fprintln: 将数据输出到输出六种,并添加换行
  • Fscan: 从输入流中读出
  • Fscanf: 从输入流中按照指定格式读取数据
  • Fscanln: 从输入流中读取数据,回车作为结束符

    输出到标准输出

  • Print: 将数据输出到标准输出流中,不添加换行

  • Printf: 将数据输出到按照一定格式输出到标准输出流中
  • Println: 将数据输出到标准输出六种,并添加换行

    标准输入中读取数据

  • Scan: 从标准输入流中读取数据

  • Scanf: 从标准输入流中按照指定格式读取数据
  • Scanln: 从标准输入流中读取数据,回车作为结束符

    转换字符串

  • Sprint: 将数据转换为字符串,不添加换行

  • Sprintf:将数据按照格式转换为字符串
  • Sprintln: 将数据转换为字符串,并添加换行

    字符串中读取数据

  • Sscan: 从字符串中读取数据

  • Sscanf: 从字符串中按照格式读取数据
  • Sscanln: 从字符串中读取数据,回车作为结束符

    实操

    learnPrint.go

    ```go package learnPrint

import ( “fmt” “os” )

func LearnErrorf() { fmt.Println(fmt.Errorf(“我是个错误”)) }

func LearnPrint() { fmt.Print(“我是不带换行的标准输出\n”) fmt.Printf(“输出需要指定类型 %s\n”, “args:string”) fmt.Println(“我是带换行的标准输出”)

  1. fmt.Fprint(os.Stdout, "func fmt.Fprint\n")
  2. fmt.Fprintf(os.Stdout, "func %s\n", "fmt.Fprintf")
  3. fmt.Fprintln(os.Stdout, "func fmt.Fprintln")
  4. fmt.Printf("%q\n", fmt.Sprint("我是被当作参数引入的 不带换行\n"))
  5. fmt.Printf("%q\n", fmt.Sprintf("我是被当作参数引入的 %s\n", "引入内容"))
  6. fmt.Printf("%q\n", fmt.Sprintln("我是被当作参数引入的"))

}

func LearnScan() { var ( name string age int weight float32 )

  1. fmt.Print("请输入信息:")
  2. fmt.Scan(&name, &age, &weight)
  3. fmt.Println(name, age, weight)
  4. fmt.Print("请输入信息:")
  5. fmt.Scanf("%s %d %f", &name, &age, &weight)
  6. fmt.Println(name, age, weight)
  7. fmt.Print("请输入信息:")
  8. fmt.Scanln(&name, &age, &weight)
  9. fmt.Println(name, age, weight)

}

  1. <a name="YRLG3"></a>
  2. #### learnPrint_test.go
  3. ```go
  4. package learnPrint
  5. import "testing"
  6. func TestLearnErrorf(t *testing.T) {
  7. LearnErrorf()
  8. }
  9. func TestLearnPrint(t *testing.T) {
  10. LearnPrint()
  11. }
  12. func TestLearnScan(t *testing.T) {
  13. LearnScan()
  14. }

实操

  1. === RUN TestLearnErrorf
  2. 我是个错误
  3. --- PASS: TestLearnErrorf (0.00s)
  4. === RUN TestLearnPrint
  5. 我是不带换行的标准输出
  6. 输出需要指定类型 args:string
  7. 我是带换行的标准输出
  8. func fmt.Fprint
  9. func fmt.Fprintf
  10. func fmt.Fprintln
  11. "我是被当作参数引入的 不带换行\n"
  12. "我是被当作参数引入的 引入内容\n"
  13. "我是被当作参数引入的\n"
  14. --- PASS: TestLearnPrint (0.00s)
  15. === RUN TestLearnScan
  16. # 由于需要输入内容,在测试中没有进行输入内容。所以获取不到输入内容信息 所以打印了默认值 0 0 ""
  17. 请输入信息: 0 0
  18. 请输入信息: 0 0
  19. 请输入信息: 0 0
  20. --- PASS: TestLearnScan (0.00s)
  21. PASS
  22. 进程 已完成,退出代码为 0

io

io包主要提供对流的基本操作功能

常用常量

  • EOF: 表示文件读取结束

    常用函数

  • Copy: 将输出流复制到输入流中

  • CopyBuffer: 将输出流复制到输出流中,同时拷贝到字节切片中
  • CopyN: 从输入流中复制N个字节到输出流
  • WriteString:像输出流中写入字符串

    常用结构体

  • MultiReader: 将多个流合并为一个流,依次从不同流读取数据

  • MultiWriter: 将多个流合并为一个流,在写入时对所有流进行写入

    实操

    与ioutil写在一起

io/ioutil

ioutil 包 主要提供对流的实用操作功能

常用函数

  • ReadAll: 读取流中所有内容
  • ReadDir: 读取目录中文件信息
  • ReadFile: 读取文件
  • TempDir: 创建临时目录
  • TempFile: 创建临时文件
  • WriteFile: 写入文件

    实操

    learnio.go

    ```go package learnio

import ( “bytes” “fmt” “io” “io/ioutil” “os” “strings” )

func LearnIo() { sreader := strings.NewReader(“Hello, ligz\n”) io.Copy(os.Stdout, sreader)

  1. breader := bytes.NewReader([]byte("Hello, ligz\n"))
  2. io.Copy(os.Stdout, breader)
  3. bbuffer := bytes.NewBufferString("Hello, ligz\n")
  4. io.CopyN(os.Stdout, bbuffer, 2)
  5. fmt.Println()
  6. io.CopyN(os.Stdout, bbuffer, 2)
  7. fmt.Println()
  8. io.CopyN(os.Stdout, bbuffer, 2)
  9. fmt.Println()
  10. io.WriteString(os.Stdout, "hello, ligz\n")

}

func LearnIoutil() { // 读取文件所有内容 if file, err := os.Open(“t01.txt”); err == nil { defer func() { = file.Close() }() content, := ioutil.ReadAll(file) fmt.Println(string(content)) }

  1. // 读取文件目录
  2. if ffs, err := ioutil.ReadDir("."); err == nil {
  3. for _, fs := range ffs{
  4. fmt.Println(fs.Name(), fs.IsDir(), fs.Size(), fs.ModTime(), fs.Mode())
  5. }
  6. }
  7. // 读取文件内容
  8. if content, err := ioutil.ReadFile("t01.txt"); err == nil {
  9. fmt.Println(string(content))
  10. }
  11. // 写入文件
  12. ioutil.WriteFile("t01.txt", []byte("我是一只小小鸟,怎么飞也飞不高!"), 0755)
  13. //创建临时文件夹
  14. fmt.Println(ioutil.TempDir("", "test"))
  15. // 创建临时文件
  16. tempFile, _ := ioutil.TempFile("", "test")
  17. defer tempFile.Close()
  18. fmt.Println(tempFile.Name())
  19. io.WriteString(tempFile, "我就看看不说话")
  20. var tmpStr = make([]byte, 1024)
  21. n, _ := tempFile.Read(tmpStr)
  22. fmt.Println(string(tmpStr[:n]))

}

  1. <a name="YI7wL"></a>
  2. #### learnio_test.go
  3. ```go
  4. package learnio
  5. import "testing"
  6. func TestLearnIo(t *testing.T) {
  7. LearnIo()
  8. }
  9. func TestLearnIoutil(t *testing.T) {
  10. LearnIoutil()
  11. }

执行结果

  1. === RUN TestLearnIoutil
  2. 我是一只小小鸟,怎么飞也飞不高!
  3. learnio.go false 1467 2021-08-27 15:39:25.2450786 +0800 CST -rw-rw-rw-
  4. learnio_test.go false 135 2021-08-27 15:36:46.8712191 +0800 CST -rw-rw-rw-
  5. t01.txt false 48 2021-08-27 15:36:48.2102834 +0800 CST -rw-rw-rw-
  6. 我是一只小小鸟,怎么飞也飞不高!
  7. C:\Users\ligz\AppData\Local\Temp\test108347351 <nil>
  8. C:\Users\ligz\AppData\Local\Temp\test959636298
  9. --- PASS: TestLearnIoutil (0.01s)
  10. PASS
  11. 进程 已完成,退出代码为 0

bufio

bufio包提供缓冲流的功能

常用结构体

  • Reader

常用函数

  • NewReader: 创建缓冲输入流

常用方法

  • Read: 读取数据到切片中
  • ReadLine: 读取一行内容到字节切片中
  • ReadSlice: 根据分隔符读取数据到字节切片
  • ReadString:根据分隔符读取数据到字符串
  • Reset:重设缓冲流
  • WriteTo:将数据写入到输出流
    • Scanner

常用函数

  • NewScanner: 创建扫描对象

常用方法

  • Scan: 扫描数据
  • Split: 定义流分割函数,默认是空格
  • Text: 读取数据
  • Err: 获取错误
    • Writer

常用函数

  • NewWriter: 创建缓冲输出流

常用方法

  • Write: 将字节切片内容写入
  • WriteString: 将字符串写入
  • Reset: 重置输出流
  • Flush: 刷新数据到输出流

    实操

    learnBufio.go

    ```go package learnBufio

import ( “bufio” “bytes” “fmt” “os” “strings” )

func LearnBufio() { // 缓冲输入流 sreader := strings.NewReader(“Hello ligz\nhello, lisi”) breader := bufio.NewReader(sreader) fmt.Println(breader.ReadLine()) fmt.Println(breader.ReadLine()) fmt.Println(breader.ReadLine())

  1. sreader.Seek(0, 0) // 将读取文件的指针位置指向文件起始位置
  2. breader.WriteTo(os.Stdout) // 将数据输出到终端
  3. fmt.Println()

}

func LearnScanner() { // 定义扫描器 scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { fmt.Println(scanner.Text()) }

  1. if err := scanner.Err(); err != nil {
  2. fmt.Println(err)
  3. }

}

func LearnWriter() { // 缓冲输入流 bbuffer := bytes.NewBufferString(“”) bwriter := bufio.NewWriter(bbuffer) bwriter.WriteString(“hello, ligz\n”) bwriter.Write([]byte(“hello, zhangsan”)) bwriter.Flush()

  1. bbuffer.WriteTo(os.Stdout)

}

  1. <a name="iebUr"></a>
  2. #### learnBufio_test.go
  3. ```go
  4. package learnBufio
  5. import "testing"
  6. func TestLearnBufio(t *testing.T) {
  7. LearnBufio()
  8. }
  9. func TestLearnScanner(t *testing.T) {
  10. LearnScanner()
  11. }
  12. func TestLearnWriter(t *testing.T) {
  13. LearnWriter()
  14. }