• Как вызывать и работать с exe файлом с помощью golang в windows?

    tiabc
    @tiabc
    Бизнес-партнер и консультант по технологиям
    В дополнение к ответу Александра, если требуется не только прочитать какие-то данные из сторонней программы, но еще и что-то ввести в ее стандартный поток ввода (как я понял, основная задача именно в этом), можно поступить так:

    package main
    
    import (
    	"fmt"
    	"log"
    	"os/exec"
    )
    
    func main() {
    	cmd := exec.Command("cmd", "/C", "C:/gopath/src/script/for.exe")
    
    	// Чтобы вводить что-то в стандартный поток ввода другой программы, нужно получить ее pipe.
    	pipe, err := cmd.StdinPipe()
    	if err != nil {
    		log.Fatal(err)
    	}
    	// Куда впоследствии можно что-то писать.
    	pipe.Write([]byte("piggybank"))
    	// После ввода всех данных нужно обязательно его закрыть.
    	pipe.Close()
    
    	// Самый простой способ получить вывод другой программы, использовать:
    	output, err := cmd.Output()
    	if err != nil {
    		log.Fatal(err)
    	}
    	fmt.Print(string(output))
    }
    Ответ написан
    1 комментарий
  • Как вызывать и работать с exe файлом с помощью golang в windows?

    package main
    
    import (
    	"bufio"
    	"fmt"
    	"log"
    	"os/exec"
    )
    
    func main() {
    	cmd := exec.Command("cmd", "/C", "C:/gopath/src/script/for.exe")
    
    	// Получаем reader для STDOUT запущенной программы
    	// Это нужно делать до её запуска
    	stdoutPipe, err := cmd.StdoutPipe()
    	if err != nil {
    		log.Fatal("Cannot get stdout pipe: ", err)
    	}
    
    	// Запускаем команду
    	err = cmd.Start()
    	if err != nil {
    		log.Fatal("Cannot start the command: ", err)
    	}
    
    	// Создаём более удобный интерфейс чтения
    	r := bufio.NewReader(stdoutPipe)
    	// Читаем из stdout одну строку (пока не встретим перевод строки \n)
    	str, err := r.ReadString('\n')
    	if err != nil {
    		log.Fatal("Cannot read from STDOUT: ", err)
    	}
    	fmt.Println(str)
    }
    Ответ написан
    2 комментария
  • Как в go получить результат sql запроса по частям?

    tiabc
    @tiabc
    Бизнес-партнер и консультант по технологиям
    Позволяет по дефолту, но не по тысяче строк, а в виде курсора, который двигается при каждом вызове rows.Next(), о чем подробнее можно прочитать в документации database/sql:
    https://golang.org/pkg/database/sql/#Rows

    Там же есть пример, который это иллюстрирует:
    rows, err := db.Query("SELECT ...")
    ...
    defer rows.Close()
    for rows.Next() {
        var id int
        var name string
        err = rows.Scan(&id, &name)
        ...
    }
    err = rows.Err() // get any error encountered during iteration
    ...


    Только в Go для конкретных баз данных написаны разные драйверы: https://github.com/golang/go/wiki/SQLDrivers
    И хорошо бы заранее проверить в исходниках, что драйвер, который вы используете, действительно использует курсор внутри, а не считывает, например, сразу все в слайс и выдает элементы из него по одному.
    Ответ написан
    Комментировать
  • Как понять эту строчку в коде?

    v — это пустой интерфейс interface{}, в котором может лежать абсолютно любое значение любого типа данных. Чтобы достать оттуда это значение и использовать, надо привести его к нужному типу.
    v.(string) приводит его к типу string. Мы тут можем так делать, так как знаем, что Get нам возвращает string. Если в v при этом будет лежать не string, мы получим панику на строчке v.(string).
    https://tour.golang.org/methods/15
    Ответ написан
    Комментировать