Вспомнил 1 трюк из гугла (рассказанный на афтепати GoGoConf 2019).
Вот есть у вас пкг отвечающий за работу с бд. И есть метод
Query(s string, args interface{})
. Все ок, но вот при его использовании ваш запрос может быть чем угодно:
Query("SELECT * FROM foo WHERE $1")
и никто вас не убережет от ошибки с непраивльным параметром, иъекцией, да чем угодно.
Естественно сесурити-тим такого позволить не мог. А эта дыра им болела. В итоге они испортили жизнь всем разрабам гугла, пишущим на го, поменяв апи на такое:
type safeString string
Query(s safeString, args interface{})
Внезапно не так уж много и поменялось. Вот только теперь запрос должен быть обычный string literal. В простонародье
s := "yo"
.
Потому-что переменную неэкспортнутого типа можно определить только через compile-time строку (ака константу).
В итоге все (или в скором времени) запросы к БД должны быть известны и определены во время компиляции. Такие дела.