Michael
А, ну если вы плюете на лицензии - мне вас искренне жаль
Тут стоит вам напомнить слова гражданина Лаврова, потом даже в не любимой вами РФ есть положение о призумности не виновности, а за уши вас вожно притянуть за клевету, и к офтальмологу- чтобы открывали глаза и читали что вам писали несколько раз
Anonymous
Michael
Это т9
Michael
Спасибо
Anonymous
Кстати, насколько легко из скомпилированного бинарника go получить исходный код программы?
Stanislav
Cat
Michael
Не,не, жгите, подтверждайте свою)
Michael
Мастерство и инструменты - и нет проблем
Cat
Michael
а кто вводил?)
Michael
вы уже или договаривайте или дествительно не реагируйте)
Anton
гоферы 👋 подскажите такую штуку. хочу сделать методы для получения данных из bolt с сигнатурой вроде той, как это сделано в gorm. у них, например, юзеры получаются таким образом:
user := User{}
users := []User{}
db.First(&user)
db.Find(&users)
соответственно, для получения одного юзера и слайса юзеров. у них там, видимо, используется reflection, мне такого не надо, я сделал простую функцию для получения одного элемента из базы в общем виде и функцию для получения одного элемента конкретного типа, выглядит это как-то так:
// функция в общем виде для
// получения одно элемента
func (d *Database) getBucketEntryByKey(v interface{}, bucketKey, key []byte) error {
return d.DB.View(func(tx *bolt.Tx) error {
b := tx.Bucket(bucketKey)
bytes := b.Get(key)
if bytes == nil {
return nil
}
// тут просто происходит маршаллинг
// в interface{}, ему всё равно, куда
return json.Unmarshal(bytes, &v)
})
}
// функция для получения одного Promotion
func (d *Database) getPromotionByID(v interface{}, id uuid.UUID) error {
return d.getBucketEntryByKey(v, bucketKeyPromotions, id.Bytes())
}
но вот если я хочу сделать функцию для получения всех элементов (слайса), как мне это реализовать? вот так не катит, потому что я не могу анмаршаллить в [][]byte:
func (d *Database) getBucketEntries(v interface{}, bucketKey []byte) error {
return d.DB.View(func(tx *bolt.Tx) error {
var data [][]byte
b := tx.Bucket(bucketKey)
c := b.Cursor()
for k, v := c.First(); k != nil; k, v = c.Next() {
data = append(data, v)
}
return json.Unmarshal(data, &v)
})
}
Anton
т.е. получается, что я из базы могу доставать по одной записи (`[]byte`, который соответствует одной записи), я прохожу по ним всем, собираю их и хочу сделать анмаршаллинг всего этого дела в некую переменную, которая является слайсом сущностей.
Anton
gist для наглядности https://gist.github.com/egorovli/7ce204ac20be6db406f320f394149d6e
Евгений
Roman
А где на практике применяется?
мы применяем её в продакшне в 2 коммерческих проектах на данный момент
использует ли её кто-то кроме нас? буду реалистичен и предположу что пока ещё нет, поскольку последний релиз это release candidate, нежели final release.
в плане стабильности она уже довольно хороша. В плане производительности - не уверен, нужно более точно измерять, в чём собственно и нужна помощь комьюнити
Евгений
$continue$
всем привет. столкнулся с такой проблемой, что почему то функция возвращает пустые строки. Хотя body не пустой и там json (дебагал в go-resty). Исходя из этого, есть предположение, что не работает декодер json
Второй скрин это callmethod.
Сама либа - https://github.com/urShadow/go-vk-api
https://i.imgur.com/qgrrvIN.png
https://i.imgur.com/W6DWAyy.png
https://i.imgur.com/0LT5YsP.png
$continue$
В чем может быть проблема?
Zhenja
ну первая Ваша проблема - это код скриншотами
Zhenja
а вторая - имена полей в структуре маленькими буквами
Alexander
Zhenja
Stepan
Подскажите, в го есть функция чтобы найти минимальный элемент в массиве int64?
Kirill
Cat
"There is no built-in for this."
Cat
но, вы можете отсортировать слайс/массив, и потом взять крайний элемент 🙂
L
Cat
потому что функции сортировки есть в pkg/sort
L
можно же в одну проходочку найти без сортировки
Cat
но придётся писать свою функцию
L
что там писать?
Vadim
7 строк
Cat
ну а с sort — 2 строки
L
4 строки, учитывая что одна закрывающая скобка
L
S := []float64{2, 3, 4, 5, 6, 6, 8, 1}
min := S[0]
for i := 1; i < len(S); i++ {
min = math.Min(min, S[i])
}
Cat
range
Kirill
тут же не стоит говорить, что максимальное значение float64 от int64?
Cat
Kirill
саша
L
саша
саша
Говорю, что вызов функции обобщённой проще читать, чем вызов необобщённой. Писать - ещё легче.
L
Daniel
коллеги, вы всерьез собираетесь максимум искать через сортировку?
саша
саша
Но через сортировку это конечно топ рофл. Хотя где-то я такое на самом деле видел...
Cat
Но через сортировку это конечно топ рофл. Хотя где-то я такое на самом деле видел...
func main() {
s := []float64{2, 3, 4, 5, 6, 6, 8, 1}
sort.Slice(s, func(i, j int) bool { return i < j })
fmt.Println("min:", s[0])
}
Cat
в чём рофл-то? 2 строки
Cat
даже одна
саша
саша
vs
саша
O (n)
Daniel
в том, что один проход по слайсу с одной переменной и одним сравнением на ячейку - это раз в 10 меньше работы, чем сортировка
Daniel
$continue$
Cat
нет, мой поинт в том, что это уже есть в std
Cat
и не надо ничего писать
Stanislav
$continue$
min/max работает за O(n)
$continue$
ибо body не пустой 100%