golang相对路径,golang路线

本文目录一览:

GOLang CLI

基本概念这里不过多的叙述,也就是commands,arguments,和flags

这里主要介绍下Generator,因为Generator是一个非常好用的工具,可以非常方便的添加commands。

基本命令

cobra init:初始化

cobra add:添加子command

添加子command

这个部分比较简单,在使用的过程中直接创建对应的command即可

使用flags

不过flags有多种类型:

首先会用到的就是一个CLI的argument。可以直接通过

返回的args是一个slice,slice的第一个元素是程序的path,也就是运行这个go程序的相对路径。args[1:]才是后边的args。参数按照空格的方式分割。

经常使用还有CLI的一些option的内容,也就是根据flag获得对应flag的参数。

示例

会根据flag的内容输出对应的option的结果。

按照flag的例子接着使用一些argument的内容

调用命令的方式为./main -word=word -fork=true 1 2 3 4

最终的结果是flag对应的Arg内容是最后的参数内容。但是os.Args还是按照arguments的规则来区分的。

pflag的基本功能和flag相同,但是支持一些更丰富的操作。

一些特殊的需求可以使用pflag来实现。

golang如何创建目录

golang中关于目录与文件名等操作都在os这个包中,具体的创建目录都是通过Mkdir和MkdirAll这2个函数来实现的,这两个函数用法一致

os.Mkdir(dirName string, perm FileMode)

dirName即要创建的目录(文件夹路径),可以是绝对路径,也可以是相对路径(相对于GOPATH)

perm表示创建的目录的权限,如0777(读r权限值为4,写权限w值为2,执行权限x值为1)

如:我要在/data/program/goapp这个目录下创建一个golang这个子目录,示例如下:

package main

import (

   "os"

   "fmt"

)

func main() {

   err := os.Mkdir("/data/program/goapp/golang", 0666)

   if err != nil {

      fmt.Println(err)

   }

}

注:Mkdir和MkdirAll的区别

Mkdir创建目录,它的父级目录必须是存在的,不然创建会失败

MkdirAll可以递归创建目录,即只要根目录存在即可,如下:

err := os.MkdirAll("/data/program/goapp/golang/test/hello", 0766)

if err != nil {

   fmt.Println(err)

}

本例中:/data/program/goapp是已经存在的目录,而子目录golang/test/hello是不存在,此时要使用MkdirAll来创建

golang 进程创建,fork,以及热重启(无缝升级)

一般来说,进程的操作使用的是一些系统的命令,所以go内部使用os包,进行一些运行系统命令的操作

os 包及其子包 os/exec 提供了创建进程的方法。

一般的,应该优先使用 os/exec 包。因为 os/exec 包依赖 os 包中关键创建进程的 API,为了便于理解,我们先探讨 os 包中和进程相关的部分。

Unix :fork创建一个进程,(及其一些变种,如 vfork、clone)。

Go:Linux 下创建进程使用的系统调用是 clone。

允许一进程(父进程)创建一新进程(子进程)。具体做法是,新的子进程几近于对父进程的翻版:子进程获得父进程的栈、数据段、堆和执行文本段的拷贝。可将此视为把父进程一分为二。

终止一进程,将进程占用的所有资源(内存、文件描述符等)归还内核,交其进行再次分配。参数 status 为一整型变量,表示进程的退出状态。父进程可使用系统调用 wait() 来获取该状态。

目的有二:其一,如果子进程尚未调用 exit() 终止,那么 wait 会挂起父进程直至子进程终止;其二,子进程的终止状态通过 wait 的 status 参数返回。

加载一个新程序(路径名为 pathname,参数列表为 argv,环境变量列表为 envp)到当前进程的内存。这将丢弃现存的程序文本段,并为新程序重新创建栈、数据段以及堆。通常将这一动作称为执行一个新程序。

没有直接提供 fork 系统调用的封装,而是将 fork 和 execve 合二为一,提供了 syscall.ForkExec。如果想只调用 fork,得自己通过 syscall.Syscall(syscall.SYS_FORK, 0, 0, 0) 实现。

os.Process 存储了通过 StartProcess 创建的进程的相关信息。

一般通过 StartProcess 创建 Process 的实例,函数声明如下:

它使用提供的程序名、命令行参数、属性开始一个新进程。StartProcess 是一个低级别的接口。os/exec 包提供了高级别的接口,一般应该尽量使用 os/exec 包。如果出错,错误的类型会是 *PathError。

属性定义如下:

FindProcess 可以通过 pid 查找一个运行中的进程。该函数返回的 Process 对象可以用于获取关于底层操作系统进程的信息。在 Unix 系统中,此函数总是成功,即使 pid 对应的进程不存在。

Process 提供了四个方法:Kill、Signal、Wait 和 Release。其中 Kill 和 Signal 跟信号相关,而 Kill 实际上就是调用 Signal,发送了 SIGKILL 信号,强制进程退出,关于信号,后续章节会专门讲解。

Release 方法用于释放 Process 对象相关的资源,以便将来可以被再使用。该方法只有在确定没有调用 Wait 时才需要调用。Unix 中,该方法的内部实现只是将 Process 的 pid 置为 -1。

通过 os 包可以做到运行外部命令,如前面的例子。不过,Go 标准库为我们封装了更好用的包: os/exec,运行外部命令,应该优先使用它,它包装了 os.StartProcess 函数以便更容易的重定向标准输入和输出,使用管道连接 I/O,以及作其它的一些调整。

exec.LookPath 函数在 PATH 指定目录中搜索可执行程序,如 file 中有 /,则只在当前目录搜索。该函数返回完整路径或相对于当前路径的一个相对路径。

func LookPath(file string) (string, error)

如果在 PATH 中没有找到可执行文件,则返回 exec.ErrNotFound。

Cmd 结构代表一个正在准备或者在执行中的外部命令,调用了 Run、Output 或 CombinedOutput 后,Cmd 实例不能被重用。

一般的,应该通过 exec.Command 函数产生 Cmd 实例:

用法

得到 * Cmd 实例后,接下来一般有两种写法:

前面讲到,通过 Cmd 实例后,有两种方式运行命令。有时候,我们不只是简单的运行命令,还希望能控制命令的输入和输出。通过上面的 API 介绍,控制输入输出有几种方法:

参考资料:

003-golang 调用外部命令

003-golang 调用外部命令

相关函数

exec包执行外部命令,它将os.StartProcess进行包装使得它更容易映射到stdin和stdout,并且利用pipe连接i/o.

func LookPath(file string) (string, error) //LookPath在环境变量中查找科执行二进制文件,如果file中包含一个斜杠,则直接根据绝对路径或者相对本目录的相对路径去查找

在用exec包调用的其他进程后如何关闭结束,可以使用context包的机制进行管理,context包的使用详见:

exec.CommandContext方发实现了context,通过context可以对exec启动的进程结束。

隐藏程序自身黑窗口的方法:go build -ldflags="-H windows"

隐藏子进程黑窗口的方法:

intellij golang 用相对路径还是绝对路径好些

在运行时取不到资源应该是运行时VM的类路径配置问题。

试试在试图读入资源文件的位置打断点。运行到断点处暂停后用Alt-F8开表达式窗口。

输入this.getClass().getProtectionDomain().getCodeSource().getLocation() 然后点evaluate 按钮。

看看你的类是从什么位置读进来的,确认是不是你的target目录。

本文链接:https://my.lmcjl.com/post/19955.html

展开阅读全文

4 评论

留下您的评论.