捕捉信號 Go // 運行此程式,控制台將列印"Waiting for signal" // 按Ctrl + C 發送信號以關閉程式,將發生中斷 // 隨後控制台依次列印"Signal .."、"Exiting..." package main import ( "os" "os/signal" " ...
捕捉信號
// 運行此程式,控制台將列印"Waiting for signal"
// 按Ctrl + C 發送信號以關閉程式,將發生中斷
// 隨後控制台依次列印"Signal .."、"Exiting..."
package main
import (
"os"
"os/signal"
"syscall"
"fmt"
)
func main() {
// 緩衝通道捕捉信號
signals := make(chan os.Signal, 1)
done := make(chan bool)
// Notify將輸入信號轉發到channel
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM)
go func() {
sig := <- signals
fmt.Println(sig)
fmt.Println("Signal captured and processed...")
done <- true
}()
fmt.Println("Waiting for signal")
<- done
fmt.Println("Exiting the application...")
}
運行子進程
// 在Go程式中運行其他進程
package main
import (
"os/exec"
"fmt"
)
func main() {
// Command接收兩個參數:命令、命令參數
// lsCommand := exec.Command("ls", "-a")
lsCommand := exec.Command("ls")
// Output執行命令並返回標準輸出的切片。
output, _ := lsCommand.Output()
//Run函數阻塞進程直到lsCommand執行完畢,與之類似到Start函數不阻塞
lsCommand.Run()
// 獲取進程ID
fmt.Println(lsCommand.Process.Pid)
// 獲取ls命令結果
fmt.Println(string(output))
}
處理命令行參數
package main
import (
"os"
"fmt"
)
func main() {
// os.Args的第一個元素是可執行文件路徑,所以獲取參數從下標1開始
realArgs := os.Args[1:]
if len(realArgs) == 0 {
fmt.Println("Please pass an argument.")
return
}
if realArgs[0] == "a" {
writeHelloWorld()
} else if realArgs[0] == "b" {
writeHelloMars()
} else {
fmt.Println("Please pass a valid argument.")
}
}
func writeHelloWorld() {
fmt.Println("Hello, World!")
}
func writeHelloMars() {
fmt.Println("Hello, Mars!")
}
// 執行"go run main.go a"將輸出"Hello, World!"
// 執行"go run main.go b"將輸出"Hello, Mars!"