Trace/breakpoint trap (core dumped)
param(
[string]$Platform = "linux", # linux, windows, darwin (macOS)
[string]$Arch = "amd64", # amd64, arm64, 386
[string]$OutputName = "myapp",
[string]$GoFile = "main.go"
)
Write-Host "Компиляция для $Platform/$Arch..."
$env:GOOS = $Platform
$env:GOARCH = $Arch
$env:CGO_ENABLED = 0
go build -o "$OutputName-$Platform-$Arch" $GoFile
if ($LASTEXITCODE -eq 0) {
Write-Host "Успешно: $OutputName-$Platform-$Arch" -ForegroundColor Green
} else {
Write-Host "Ошибка компиляции!" -ForegroundColor Red
exit 1
}
package main
import (
"database/sql"
"encoding/json"
"fmt"
"log"
"net"
"net/http"
"strings"
)
import _ "github.com/go-sql-driver/mysql"
func handler(c net.Conn) {
addr := c.RemoteAddr().String()
fmt.Println("new connection")
fmt.Println(addr)
c.Write([]byte("ok"))
c.Close()
}
func main() {
log.Println("Программа запущена")
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello World!")
})
http.HandleFunc("/lists", func(w http.ResponseWriter, r *http.Request) {
fmt.Println("/lists входящий запрос")
db, err := sql.Open("**************************")
if err != nil {
fmt.Fprintf(w, "Ошибка подключения к базе")
fmt.Println("Ошибка подключения к базе")
panic(err)
return
}
defer db.Close()
rows, err := db.Query("SELECT lists.id, lists.title, lists.code, lists.type FROM lists LEFT JOIN list_items ON lists.id = list_items.list_id")
if err != nil {
panic(err)
}
defer rows.Close()
// JSON
if err := printJSONResults(w, rows); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
// TEXT
//w.Header().Set("Content-Type", "text/plain")
//if err := printPlainTextResults(w, rows); err != nil {
// http.Error(w, err.Error(), http.StatusInternalServerError)
//}
})
log.Println("Установлены хэндлеры")
http.ListenAndServe(":5000", nil)
log.Println("Приложение запущено на 5000 порту")
}
func printJSONResults(w http.ResponseWriter, rows *sql.Rows) error {
cols, err := rows.Columns()
if err != nil {
return err
}
var results []map[string]interface{}
values := make([]interface{}, len(cols))
pointers := make([]interface{}, len(cols))
for i := range values {
pointers[i] = &values[i]
}
for rows.Next() {
err := rows.Scan(pointers...)
if err != nil {
return err
}
row := make(map[string]interface{})
for i, col := range cols {
val := values[i]
if b, ok := val.([]byte); ok {
row[col] = string(b) // Преобразование []byte в string
} else {
row[col] = val
}
}
results = append(results, row)
}
w.Header().Set("Content-Type", "application/json")
return json.NewEncoder(w).Encode(results)
}
func printPlainTextResults(w http.ResponseWriter, rows *sql.Rows) error {
cols, err := rows.Columns()
if err != nil {
return err
}
// Заголовки столбцов
var header string
for _, col := range cols {
header += fmt.Sprintf("%-15s", col) // Форматирование с фиксированной шириной
}
fmt.Fprintln(w, header)
fmt.Fprintln(w, strings.Repeat("-", len(cols)*15))
// Данные
values := make([]interface{}, len(cols))
pointers := make([]interface{}, len(cols))
for i := range values {
pointers[i] = &values[i]
}
for rows.Next() {
err := rows.Scan(pointers...)
if err != nil {
return err
}
var row string
for _, val := range values {
row += fmt.Sprintf("%-15v", val)
}
fmt.Fprintln(w, row)
}
return nil
}
type List struct {
ID int `json:"id" db:"id"`
Title string `json:"title" db:"title"`
Code string `json:"code" db:"code"`
Type string `json:"type" db:"type"` // В коде - `Type`, но в БД/JSON - `type`
}