
The
20.03.2018
17:44:11
вы сравниваете два интерфейса, но под ними лежат два разных динамических типа. как-то так.
вообще, если вы работаете с базой, то лучше опираться на код ошибки
чем на текст ошибки

Труба
20.03.2018
17:45:49

Google

Roman
20.03.2018
17:59:03
err := doit()
switch err := err.(type) {
case nil:
// great job!
case CantDoItErr:
// that's an excuse, back to work!
case BrokeMyLegErr:
// hilarious excuse, back to work!
default:
// oh, come on, what's wrong?
}

Aleksandr
20.03.2018
18:03:48

The
20.03.2018
18:09:20
ну я надеюсь хоть что-то прояснил в интерфейсах товарищу выше

Труба
20.03.2018
18:12:13
Мне все ответы очень понравились, потому что обработка ошибок и вообще работа с интервейсами это очень важная вещь

Aleksandr
20.03.2018
18:13:44

Vadim
20.03.2018
18:28:28
Ребят
Нужна помощь. Или я тупой, или компилятор. Я написал две константы, а он их не видит. Также метод один не видит. Что делать?

Alexey
20.03.2018
18:30:22

Vadim
20.03.2018
18:44:07
const blocksBucket = "blocks"
func (bc *Blockchain) AddBlock(data string) {
var lastHash []byte
_ = bc.db.View(func(tx *bolt.Tx) error{
b:= tx.Bucket([]byte(blocksBucket))
lastHash = b.Get([]byte("l"))
return nil
})
newBlock := NewBlock(data,lastHash)
_ = bc.db.Update(func(tx *bolt.Tx) error{
b := tx.Bucket([]byte(blocksBucket))
_ = b.Put(newBlock.Hash, newBlock.Serialize())
_ = b.Put([]byte("l"),newBlock.Hash)
bc.tip = newBlock.Hash
return nil
})
Ошибка: undefined: blocksBucket

Alexey
20.03.2018
18:45:42
Это всё в одном файле?

Vadim
20.03.2018
18:46:00
func (b *Block) Serialize() []byte{
var result bytes.Buffer
encoder := gob.NewEncoder(&result)
_ = encoder.Encode(b)
return result.Bytes()
}
Ошибка: newBlock.Serialize undefined (type *Block has no field or method Serialize)
Да

Google

Vadim
20.03.2018
18:46:27
func (bc *Blockchain) AddBlock(data string) {
var lastHash []byte
_ = bc.db.View(func(tx *bolt.Tx) error{
b:= tx.Bucket([]byte(blocksBucket))
lastHash = b.Get([]byte("l"))
return nil
})
newBlock := NewBlock(data,lastHash)
_ = bc.db.Update(func(tx *bolt.Tx) error{
b := tx.Bucket([]byte(blocksBucket))
_ = b.Put(newBlock.Hash, newBlock.Serialize())
_ = b.Put([]byte("l"),newBlock.Hash)
bc.tip = newBlock.Hash
return nil
})
}

Alexey
20.03.2018
18:49:06
А когда компилируете, точно все файлы указываете?

Vadim
20.03.2018
18:49:47
Да
Сейчас все тоны кода переместил в один файл. Всё равно

Alexey
20.03.2018
18:53:46
Ну магии же обычно не бывает..
Точно newBlock - именно тот самый Block?

Vadim
20.03.2018
18:54:59
Да

Alexey
20.03.2018
18:58:09
Попробуйте вообще в отдельный пакет в один файл вынести только то, что нужно, чтоб воспроизвести ошибку. Struct Block, newBlock, Serialize и там в main запустить
Просто 99.999%, что где-то что-то на самом деле не то, что вы думаете там есть
Typeof можно попринтить)

Vadim
20.03.2018
19:05:51
Перезагрузил комп всё заработало

Andrey
20.03.2018
19:05:52
Как быть с конфигами в го?
type Configuration struct {
port int
}
func main() {
configuration := Configuration{}
err := gonfig.GetConf("config/config.development.json", &configuration)

Vadim
20.03.2018
19:06:12
Я в негодовании

Andrey
20.03.2018
19:06:31
например хочу сделать так, но как мне заюзать конфиг в своих пакетах?

tsov
20.03.2018
19:11:24
слать ссылку на конфиг

Aleksandr
20.03.2018
19:11:39

Vadim
20.03.2018
19:27:21
На самом деле магия какая-то

The
20.03.2018
19:29:19
это не магия, а волшебство

Google

Alexey
20.03.2018
19:30:33

Andrey
20.03.2018
19:31:50
читаю про него, но он чет слишком большой мне столько не надо https://github.com/spf13/viper

Дмитрий
20.03.2018
19:34:11
я использовал https://github.com/BurntSushi/toml

Marlik
20.03.2018
19:39:33

Arch
20.03.2018
19:44:06
Попробовал этим вечером писать в vscode, ощущение как будто на инвалидном кресле на формуле 1 участвую
И вроде особых претензий нет, но как будто весь в гибче, за вечер сто строк кода ?

Vadim
20.03.2018
19:44:54

Arch
20.03.2018
19:45:20

Vadim
20.03.2018
19:46:02
Я последнее время стал большим фанатом JetBrains и всех их продуктов

Marlik
20.03.2018
19:46:51
например хочу сделать так, но как мне заюзать конфиг в своих пакетах?
У мну так
type Config struct {
...
}
func LoadConfig() error {
b, err := ioutil.ReadFile("config.json")
if err != nil {
return errors.Wrap(err, "Not read config.json")
}
err = json.Unmarshal(b, &conf)
if err != nil {
return errors.Wrap(err, "Not unmarshal data in config.json")
}
return err
}
Глобально выставил переменную
var conf *Config
Теперь в main делаю так
err := LoadConfig()
if err != nil {
log.Fatal(err)
}
И теперь я обращаюсь к тому что лежит в конфиге так
err = InitDB(conf.DatabaseNameAndPath, err)

Arch
20.03.2018
19:47:09
Ой не, пробовал пичарм, меня очень впечатлило, что идешка грузалась пол минуты(! на ссд), не дождался закрыл, сублим наше все

Andrey
20.03.2018
19:48:16

Vadim
20.03.2018
19:48:28

Arch
20.03.2018
19:48:58

Marlik
20.03.2018
19:49:34
Спасибо
Сам config.json
`
{
"тут key": "тут value",
}

Dmitrii
20.03.2018
21:11:19
всем привет. ребят есть примеры подвязки C++ shared либы в go проект?

Aleksandr
20.03.2018
21:11:52

Александр
20.03.2018
22:53:05
сейчас бы казино обманывать в 2018....

Marlik
20.03.2018
23:15:52
@onokonem @pragus @demeliorator

Kirill
20.03.2018
23:50:50
Ребята, кто не спит?

Google

The
20.03.2018
23:51:28
я не спит

Roman
20.03.2018
23:52:17

Kirill
20.03.2018
23:52:59
Есть приложение, типа голосовалки. Один пользователь может проголосовать за другого один раз. Нужен изящный способ достать из базы случайные профили, за которые текущий пользователь ещё не голосовал
Типа как в тендере логика
Мне в голову только цикл приходит.

Admin
ERROR: S client not available

The
20.03.2018
23:53:35
ээ
а обычный запрос чем не подходит?

Roman
20.03.2018
23:54:34
если очень банально: инкрементальный id пользователей и у каждого пользователя актуальный последний, который представляет собой типа указателя в стриме
но это если очень банально

Kirill
20.03.2018
23:55:02
И выборка может меняться

The
20.03.2018
23:55:52
да, есть же хеш индексы, по ним вообще быстро можно делать NOT IN

Kirill
20.03.2018
23:56:04
Мне кажется что если доставать все голоса текущего пользователя, то это не оптимально

Roman
20.03.2018
23:56:08
SQL?
SQL это бд, а тебе нужен алгоритм

Kirill
20.03.2018
23:56:51
Да, вот на счёт not in сомневаюсь

Roman
20.03.2018
23:56:51

The
20.03.2018
23:57:06
зачем?

Kirill
20.03.2018
23:57:18
Без foreach

Google

Kirill
20.03.2018
23:57:47
Попробую not in, посмотрю на скорость

The
20.03.2018
23:57:50
просто делаем выборку всех юзеров, за которые голосовали, делаем NOT IN список юзеров, рандом + LIMIT.
это что, 100500 запросов с наносекунду что-ли?

Kirill
20.03.2018
23:58:29
Вернее не скорость, а время запроса)

The
20.03.2018
23:58:49
сколько юзеров и как часто такие запросы приходят?

Kirill
20.03.2018
23:58:51
Не хочу что бы полсекунды юзер ждал
Юзеров около 7К, не часто

The
20.03.2018
23:59:33
ну пол секунды точно там не будет.
при самом плохом сценарии думаю 20 мс где-то.
у меня по 3 млн. товарам по JSON ищет где-то 20 мс.
это не хеш индексы и не принадлежности к множеству.
оптиши потом сколько запрос будет, аж самому интересно
тут скорее рандом подосрет по времени.
можно ещё с джойном поиграться, когда то они были быстрее.

yuriy
21.03.2018
00:19:55
тю, у вас в базе тысячи пользователей
можно доставать вообще случайного 1 раз
и в 1 / 10000 случаев обращаться к базе еще раз
средний пользователь проголосует за 10 - 100 чел максимум
или вытягивать рандомно 3-5 и из них выбирать за кого не голосовал

tsov
21.03.2018
05:28:44
вот вы даете, рекомендуете человеку на гошанище запросами в sql такое решать! стыдно! я бы сначала спросил, нужна ли ему временная консистентность в базе. и сделал бы через слайс буферизованных каналов. в каналы пишем тех, за кого голосовал каждый, если в кэше на синк-мапе его еще не нашлось. отдельной горутиной шлем в базу.