Exec
Jalankan program lain dari kode Go.
Pahami konsepnya
os/exec menjalankan perintah eksternal seolah kamu mengetiknya di terminal: exec.Command("git", "status") menyiapkan proses baru. Panggil .Output() untuk menjalankan sambil menangkap stdout — hasilnya []byte plus error; .CombinedOutput() menggabungkan stdout dan stderr; .Run() sekadar menjalankan tanpa peduli keluaran.
Argumen perintah dikirim terpisah — bukan satu string utuh — sehingga tanpa shell, tanpa risiko injeksi. Bila kamu benar-benar butuh fitur shell (pipe, wildcard), bungkus dengan exec.Command("sh", "-c", "ls *.go | wc -l") dengan input yang sudah tervalidasi.
Exit code non-nol dilaporkan sebagai error bertipe *exec.ExitError — cek lewat errors.As untuk membedakan "program gagal" dari "program tidak ada". Untuk interaksi dua arah (kirim input, baca keluaran mengalir), Command menyediakan StdinPipe dan StdoutPipe.
Coba contoh kode
package main
import (
"fmt"
"os/exec"
)
func main() {
keluar, err := exec.Command("go", "version").Output()
if err != nil {
fmt.Println("gagal:", err)
return
}
fmt.Print(string(keluar))
}Command("go", "version") mencari binary go di PATH lalu menjalankannya dengan satu argumen. Output() menunggu proses selesai dan menyerahkan stdout-nya — di sini versi Go tercetak persis seperti di terminal. Bila perintah tidak ditemukan, err berisi kesalahan exec.
Exit code dan stderr
func main() {
_, err := exec.Command("git", "status").CombinedOutput()
var exitErr *exec.ExitError
if errors.As(err, &exitErr) {
fmt.Println("git keluar dengan kode:", exitErr.ExitCode())
} else if err != nil {
fmt.Println("git tidak tersedia:", err)
} else {
fmt.Println("git berjalan bersih")
}
}Ada dua rasa kegagalan: program berjalan tapi gagal (ExitError, memuat kode keluar dan stderr) versus program sama sekali tidak ditemukan (error biasa). errors.As memisahkannya — di luar folder git, contoh ini mencetak kode keluar 128.
Latihan singkat
Uji: jalankan perintah yang pasti tidak ada dan tangkap errornya dengan errors.As — program harus mencetak persis `perintah tidak ditemukan`.