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://www.506064.com/zh-hk/n/242231.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:47
下一篇 2024-12-12 12:47

相關推薦

  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • 使用Golang調用Python

    在現代軟件開發中,多種編程語言的協作是相當普遍的。其中一種使用場景是Golang調用Python,這使得在使用Python庫的同時,可以利用Golang的高性能和強大並發能力。這篇…

    編程 2025-04-29
  • 使用Golang創建黑色背景圖片的方法

    本文將從多個方面介紹使用Golang創建黑色背景圖片的方法。 一、安裝必要的代碼庫和工具 在開始創建黑色背景圖片之前,我們需要先安裝必要的代碼庫和工具: go get -u git…

    編程 2025-04-29
  • Python文件路徑賦值

    Python中文件操作是非常基本的操作,而文件路徑是文件操作的前提。本文將從多個方面闡述如何在Python中賦值文件路徑。 一、絕對路徑和相對路徑 在Python中,路徑可以分為絕…

    編程 2025-04-28
  • JS圖片沿着SVG路徑移動實現方法

    本文將為大家詳細介紹如何使用JS實現圖片沿着SVG路徑移動的效果,包括路徑製作、路徑效果、以及實現代碼等內容。 一、路徑製作 路徑的製作,我們需要使用到SVG,SVG是可縮放矢量圖…

    編程 2025-04-27
  • Python學習路線用法介紹

    你想學習一門編程語言,但不知道該從何學起?Python是一種非常流行的編程語言,因其簡單易學、功能強大而廣受歡迎。本文將從多個方面詳解Python學習路線,幫助你順利學習Pytho…

    編程 2025-04-27
  • Python成長路線

    Python是一門流行的高級編程語言,如今在數字化時代中扮演着越來越重要的角色。從數據處理到網站開發,從自動化腳本到機器學習,Python都能勝任並做得很出色。在成為一名全能Pyt…

    編程 2025-04-27
  • Python3文件路徑操作

    Python3中文件路徑操作是日常編程中常用到的基礎操作之一。在Python中,我們可以使用內置庫os來操作文件路徑,包括創建、刪除、移動、複製等文件操作。本文將深度解析Pytho…

    編程 2025-04-27
  • Python文件相對路徑怎麼寫

    Python是一門被廣泛使用的編程語言,Python腳本通常需要對文件進行讀寫操作。而那些需要讀寫的文件,其路徑往往並不在Python腳本的同一目錄下,這就需要我們了解Python…

    編程 2025-04-27
  • 關鍵路徑的詳細闡述

    關鍵路徑是項目管理中非常重要的一個概念,它通常指的是項目中最長的一條路徑,它決定了整個項目的完成時間。在這篇文章中,我們將從多個方面對關鍵路徑做詳細的闡述。 一、概念 關鍵路徑是指…

    編程 2025-04-25

發表回復

登錄後才能評論