Post #30
439
- 👍 3
- ❤ 1
GO Showing posts older than #31 · Back to latest



products с колонкой attributes, где хранятся характеристики товара.
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
price DECIMAL(10, 2) NOT NULL,
attributes JSON NOT NULL DEFAULT '{}'
);
tags внутри этого JSON будет массивом строк. Однако без строгой проверки на уровне базы данных нет гарантии, что кто-то не запишет туда числа, объекты или вообще что-то неподходящее.constraint, который автоматически проверит соответствие содержимого JSON определенной схеме при каждой операции вставки или обновления.
ALTER TABLE products ADD CONSTRAINT data_is_valid CHECK(
validate_json_schema(
'{
"type": "object",
"properties": {
"tags": {
"type": "array",
"items": { "type": "string" }
}
},
"additionalProperties": false
}',
attributes
)
);
tags приведёт к ошибке:
INSERT INTO products (..., attributes) VALUES
(..., '{}'), -- Пустой объект, допускается
(..., '{"tags": []}'), -- Пустой массив строк
(..., '{"tags": ["test"]}'); -- Массив со строкой
-- Результат: Операция успешна
INSERT INTO products (..., attributes) VALUES
(..., '{"tags": [2]}'); -- Массив с числом вместо строки
-- Ошибка: Нарушен constraint

encoding/json в стандартной библиотеке разработчики столкнулись с его ограничениями. encoding/json/v2 — он решает старые проблемы, добавляет потоковую обработку и повышает производительность.git bisect bad HEAD), и где его точно не было (git bisect good abc123). git bisect bad, бага нет → git bisect good.
git bisect run ./test_bug.sh
git log. Пусть git bisect сделает грязную работу 😉
type User struct {
Name string
}
func (u *User) SetName(name string) {
u.Name = name
}
func (u User) PrintName() {
fmt.Println(u.Name)
}
var u User
u.SetName("Alice") // Go превратил это в (&u).SetName("Alice")
u.PrintName() // Обычный value-receiver
type Named interface {
SetName(string)
PrintName()
}
var u User
var n Named
n = &u // OK: *User реализует оба метода
n = u // Ошибка: User не имеет SetName
User (значения) в method set только методы с value-receiver. У *User — и value-, и pointer-receiver. Автоматическое «взятие адреса» при работе с интерфейсами запрещено, потому что интерфейс хранит копию значения, а не сам объект.&n.(User), получили бы указатель на временную копию внутри интерфейса, которая теряется при новом присваивании. Это небезопасно.
@AuToMaton:А в старое время это делалось иначе. Никто никаких паттернов не обсуждал и не придумывал, все делали по простому. А когда замечали что делают одно и то же трижды, смотрели на написанное и устраняли дублирование.

WHERE-условия в виде SQL-подзапросов, валидировать их и использовать для запросов к базе. 
slice до кастомного управления памятью и профилирования с pprof. CrossOriginProtection.AddInsecureBypassPattern запросы, которые должны были редиректиться (например, без завершающего слэша), также попадали в список исключений. Это могло привести к неожиданному поведению. Уязвимость зарегистрирована как CVE-2025-47910 (Go issue #75054).