go get -v github.com/go-sql-driver/mysql
go mod tidy
SHOW COLUMNS FROM mytable
для получения имен полей и их типов.[]interface{}
.SELECT col1, ... colN FROM mytable
и при обработке rows.Next()
получать сами данные, которые заполнять уже в массив структур.time.Sleep(1 * time.Second)
значения берутся из канала маятника, которые будут блокироваться на указанное время. {id:, userId:, title: body:}
{ID:, userId:, title: body:}
json.Marshal
получится новый массив.как сделать вывод таким же красивым как и то что изначально?Это излишне: для компьютера это приводит лишь к дополнительным накладным расходам.
$ go mod init example.com/hello
Это важный шаг.Println
пишется с заглавной буквы. io.Pipe()
:package main
import (
"bufio"
"fmt"
"io"
"log"
"os"
"os/exec"
)
var done chan bool
type Executor struct {
wr io.Writer
}
func (e *Executor) SetStdout(w io.Writer) {
e.wr = w
}
func (e *Executor) Exec() error {
cmd := exec.Command("ls", "/etc")
cmd.Stdout = e.wr
err := cmd.Run()
return err
}
func send(lines []string) {
w := bufio.NewWriter(os.Stdout)
for i := 0; i < len(lines); i++ {
w.WriteString(lines[i] + "\n")
}
w.Flush()
}
const cnt = 3
func main() {
// create a pipe
reader, writer := io.Pipe()
e := &Executor{}
e.SetStdout(writer)
go func() {
lines := make([]string, 0, cnt)
scanner := bufio.NewScanner(reader)
linesCnt := 0
for scanner.Scan() {
line := scanner.Text()
// fmt.Println(`out:`, line)
lines = append(lines, line)
linesCnt++
if linesCnt >= cnt {
linesCnt = 0
send(lines)
lines = lines[:0] // clear
}
}
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr, "reading standard input:", err)
}
if len(lines) > 0 {
send(lines)
}
}()
err := e.Exec()
if err != nil {
log.Fatal(err)
}
log.Println("Exec finished!")
}
bufio.NewScanner
.