func1(func2())
работает только в случае если func2() возвращает ровно такие значения и столько, сколько аргументов ожидает func1()
.swap()
возвращает два значения, а fmt.Printf()
ожидает только один аргумент -- []interface{}
func printTwoValue(x, y string) {
fmt.Printf("Цена: %s , ok= %s\n", x, y)
}
printTwoValue(swap("1", "2"))
func swap(x, y string) []interface{} {
return []interface{}{y, x}
}
fmt.Printf("Цена: %s , ok= %s\n", swap("1", "2")...)
unsafe.Alignof()
https://pkg.go.dev/unsafe#Alignoftype s struct {
x int16
y int8
z int8
}
var m = map[int]methodPtr{
0: (*someStruct).method1,
}
Работающий код https://go.dev/play/p/0TqJTmuEGHU[]string
query := `
UPDATE type
SET characteristics = jsonb_insert(
characteristics, '{$1}', '{"type": "$2", "measure": "$3"}'::jsonb
)
WHERE id=$4`
tag, err := conn.Exec(ctx, query,
[]string{c.Name}, // Вот здесь попробуйте []string
c.Type, // string
c.Measure, // string
c.ID, // uint64
)
sql.Stmt
https://pkg.go.dev/database/sql#Stmt (в документации есть примеры кода). Вы можете скомпилировать sql стейтмент единожды в контексте соединения или транзакции и использовать многократно и потоко-безопасно пока жив контекст. Это даёт выигрыш в производительности.script, err := ioutil.ReadFile("path/to/procedure.sql")
if err != nil {
log.Fprintf(os.Stderr, "Error reading SQL script file: %v\n", err)
}
stmt, err := db.PrepareContext(context.Background(), string(script)) //компилируем стейтмент как шаблон c плейсхолдерами аргументов
if err != nil {
log.Fatal(err)
}
_, err = stmt.ExecContext(ctx, args) //применяем стейтмент к аргументам args... в контексте ctx
if err != nil {
log.Fprintf(os.Stderr, "Error executing SQL script: %v\n", err)
}
SELECT username FROM users WHERE id = ?
func Destruct(s any) (e []any) {
v := reflect.ValueOf(s)
if v.Kind() != reflect.Struct {
return nil
}
for i := 0; i < v.NumField(); i++ {
e = append(e, v.Field(i).Interface())
}
return
}