os/exec
package main
import (
"os/exec"
...
)
func main(){
...
//Чтобы получить приглашение в консоли
cmd := exec.Command("sudo", "su")
err := cmd.Run()
if err != nil {
fmt.Printf("%s", err)
}
...
//Или чтобы выпало окошко
out, err := exec.Command("osascript", "-e", "do shell script /path/to/myscript with administrator privileges").Output()
if err != nil {
fmt.Printf("%s", err)
}
...
}
qemu-img convert -f raw /var/lib/libvirt/images/VM.img -O vmdk VM.tmp.vmdk -o compat6
или от wmware https://www.vmware.com/products/converter.html header
, а error при попытке tw.Flush()
, который вы не проверили. После записи header
, нужно залить собственно данные tw.Write(data []byte)
и уже потом делать tw.Flush()
. Вы в header
пообещали залить данные и не залили. Кажется должно быть что то вродеif err := tw.WriteHeader(hdr); err != nil {
return err
}
if n, err := tw.Write(content); err != nil { //вот это не видно как вы сделали
return err
}
if tw.Flush(); err != nil{ //и нужно проверять все ошибки
return err
}
GO111MODULE=auto go get github.com/kataras/iris/v12@latest
func TestRaceDeposit(t *testing.T) {
setBalance(0)
go Deposit(10) //Просто этого вызова уже достаточно
Deposit(10)
if Balance() != 20 {
t.Errorf("unexpected balance: value - %d expect 20", Balance())
}
}
something = 2
something = 3
нелегальна, противоестественна. Если something = 2
, то это навсегда и не может вдруг стать =3
. При таком подходе потоки не могут получить одновременный доступ к одному месту в памяти пытаясь изменить переменную состояния. Для обмена данными между потоками можно только использовать специальные примитивы защищеннные под капотом механизмами синхронизации операционной системы(вроде Mutex или Atomic). Например очередь сообщений может быть представлена списком/list которым нельзя манипулировать напрямую, а только методами Queue.Put() Queue.Get()
. И в реализации этих методов уже зашиты блокировки от параллельного доступа к памяти.