• Как работает custom unmarshal и marshal в go?

    @PapaStifflera
    Родился, вырос...
    The language specifies that if *T implements the methods of an interface I then only a
    *T (pointer) value will satisfy I, and not a T (value) value. So encoding/json can't see
    that *DecimalE8 implements MarshalJSON because it only has a DecimalE8 value.
    It is important to preserve this property, because a value implemented on *T might
    assume that it can modify the underlying T value (which, given a value receiver, it
    could not).

    https://github.com/golang/go/issues/7536
    Ответ написан
    Комментировать
  • Выход из функции, если в течении определенного времени переменная пустая?

    Вот пример такой реализации
    https://yourbasic.org/golang/time-reset-wait-stop-...

    При каждом получении ненулевых данных от сервера, выполняйте сброс таймера обратно на 2 часа(метод reset) . При наступлении евента таймера - return
    Ответ написан
    Комментировать
  • Почему каналы в go так странно работают?

    Все просто.
    1. Если канал без буфера, то при чтении из него программа заблокируется на этом месте, пока кто-то в другой горутине не запишет в этот канал значение. Соответственно, операция записи тоже заблокируется до тех пор, пока кто-то не захочет прочитать из канала.
    2. Если канал с буфером и в буфере еще осталось место, то операция записи не заблокируется, а сразу вернет управление. Операция чтения тоже не заблокируется, если в буфере есть какие-то данные. Если же буфер полный, то запись будет вести себя так же как в п1. Если буфер пустой, то чтение будет вести себя так же как в п1.

    В вашей программе внутри createChan создается канал и сразу же делается в него запись. Эта запись блокируется в ожидании того, что кто-то прочитает из канала. Но чтение из канала у вас произойдет только при выходе из функции, поэтому программа останавливается навечно.
    Ответ написан
    Комментировать