
Zaur
08.09.2018
12:38:50
Маа шш
Они прикалываются над тобой, не слушай их, пиши на Си

Mikhail
08.09.2018
12:39:17
подскажите, сюда можно постить вакансии по go?

Zaur
08.09.2018
12:40:19

Mikhail
08.09.2018
12:40:26

Google

?
08.09.2018
13:28:41

Daniel
08.09.2018
13:44:43
спасибо. личные рекомендации - это хорошо.
надо почитать страниц 10 элекстронной версии, а потом укупить, если зайдет...

/dev/null
08.09.2018
13:48:27

Vadim
08.09.2018
13:57:56

/dev/null
08.09.2018
13:58:30
Подписываюсь.
я как его нашел, прям мания появилась, все схематизировать)

Vadim
08.09.2018
14:04:23

Zaur
08.09.2018
14:16:55
Попробуйте plantuml
Его можно прямо в визуал студио в виде плагина
Пишешь небольшой код, он тебе схемы

Heathcliff
08.09.2018
14:37:35
стоит ли хранить в context value юзера полученного с бд в миддлвейр?


Roman
08.09.2018
15:01:04
стоит ли хранить в context value юзера полученного с бд в миддлвейр?
избегайте context value по возможности, передавайте что-либо через ctx value только в случае если вам приходится передавать сиё через сторонние библиотеки, например: ваш network -> 3-rd party GraphQL library -> ваш resolver function (в этом случае без context value не обойтись, ибо соторняя библиотека посредник, которая вызывает ваши функции, не знает ничего о тех данных, которые вы хотите через неё передать)
Guys, need your opinion on that:
Should non-const types be automatically (implicitly) converted to const types?
This is without implicit non-const to const conversion:
var mut2immut * const Object = const(&Object{})
var immut2mut const * Object = &const(Object{})
var immut2immut const * const Object = const(&const(Object{}))
func NewConstSlice() const [] * const Object {
return [] * const Object {
&const(Object{}),
&const(Object{}),
}
}
This is with implicit non-const to const conversion:
var mut2immut * const Object = &Object{}
var immut2mut const * Object = &Object{}
var immut2immut const * const Object = &Object{}
func NewConstSlice() const [] * const Object {
return [] * const Object {
&Object{},
&Object{},
}
}
Do you think that implicit non-const to const conversion is safe? (bearbeitet)


Zver
08.09.2018
15:38:44

Google

Roman
08.09.2018
15:39:26

Pavel
08.09.2018
15:39:35

Roman
08.09.2018
15:40:07
Do you speak English?
йес, сори, просто лень переводить, я думаю тут не такой сложный текст чтоб его сложно было понять ?

Zver
08.09.2018
15:40:10

Pavel
08.09.2018
15:40:41
Честно говоря, даж не хочется поднимать ещё раз тему констов. Но меньше боилер плейта — лучше.

Roman
08.09.2018
15:40:55

Pavel
08.09.2018
15:41:36

Roman
08.09.2018
15:41:43

Zver
08.09.2018
15:43:33
Я родился во времена ассемблера, поэтому мне мутабельность кошернее, чем это аля раст нечитаемое месиво.

Dorian
08.09.2018
15:43:38


Roman
08.09.2018
15:44:03
Я родился во времена ассемблера, поэтому мне мутабельность кошернее, чем это аля раст нечитаемое месиво.
возможно проблема "неприязни" связана с тем, что большинство людей на Go ещё не пишут большие проекты с большими командами и огромной кодовой базой (> 50k LOC как минимум)
написать 1 человеку небольшой CLI automation tool до 1к LOC можно и без иммутабельности совершенно спокойно, и я вам открою тайну: вам даже не придётся использовать const в таком случае нигде (!)
но вот когда 100 человек, работают над 1кк LOC и малейшая ошибка может стоит огромных денег - mutable shared state это рай для багов, они плодятся там как саранча и они сожрут вам все нервы, деньги и время.
поэтому если вы хотите чтоб Go был конкурентноспособным в enterprise сфере и в сфере больших open source проектов, тогда без immutability никак.


eugene
08.09.2018
16:15:03

Евгений
08.09.2018
16:16:14
У меня даже шрам остался.

eugene
08.09.2018
16:16:20
mutable shared state напрямую ведь с проблемами concurrency связан

Roman
08.09.2018
16:16:23

eugene
08.09.2018
16:21:43

Google

eugene
08.09.2018
16:22:28
но var и const в одной строке выглядят сомнительно

Roman
08.09.2018
16:23:25

eugene
08.09.2018
16:24:21
а если создать изменяемые и неизменяеме структуры данных в библиотеке(вместо того, чтобы менять язык)?

Roman
08.09.2018
16:24:40

eugene
08.09.2018
16:26:13

Roman
08.09.2018
16:26:58

eugene
08.09.2018
16:27:54

Roman
08.09.2018
16:29:01

eugene
08.09.2018
16:29:53
?разве это нормально читается:
var immut2mut const * Object = &const(Object{})

Roman
08.09.2018
16:30:47

eugene
08.09.2018
16:31:35

eugene
08.09.2018
16:33:11
как думаете, если этот код показать junior-у:
var mut2immut * const Object = &Object{}
var immut2mut const * Object = &Object{}
var immut2immut const * const Object = &Object{}
func NewConstSlice() const [] * const Object {
return [] * const Object {
&Object{},
&Object{},
}
}
поймёт ли он быстро?

Harry
08.09.2018
16:34:12
скорее в окно выйдет

Roman
08.09.2018
16:34:41
так это тоже вызывает сомнения
как часто вы декларируете переменные через var?
ничего страшного нет в
func Func(s const[] string) {}
или даже в экстремальных случаях как:
func Func(m const map[const * const Object] const * const Object) {}
можно сделать так:
type ConstObjRef const * const Object
type ConstMap const map[ConstObjRef] ConstObjRef
func Func(m ConstMap) {}
учитывая что вас никто не заставляет использовать иммутабельные типы

Стас
08.09.2018
16:35:30

eugene
08.09.2018
16:36:29

Sergey
08.09.2018
16:36:40

Vladimir
08.09.2018
16:41:31
Насколько помню, было высоко оцененное предложение (можно поискать) использовать слово “readonly” как модификатор параметра функции. Без const и без изменений в объявлении переменных

eugene
08.09.2018
16:42:15

Google

Vladimir
08.09.2018
16:42:54
Типа того. Но только для объявления функции

eugene
08.09.2018
16:44:24
mutable shared state - это проблема concurrency, но по идее, решается с помощью мьютексов
но, например, есть https://golang.org/pkg/sync/#Map

Admin
ERROR: S client not available

eugene
08.09.2018
16:46:26
он же concurrent-safe, правильно?


Roman
08.09.2018
16:48:19
как думаете, если этот код показать junior-у:
var mut2immut * const Object = &Object{}
var immut2mut const * Object = &Object{}
var immut2immut const * const Object = &Object{}
func NewConstSlice() const [] * const Object {
return [] * const Object {
&Object{},
&Object{},
}
}
поймёт ли он быстро?
1. хуже будет если ваш джун по незнанию мутирует какой-то слайс, который ему мутировать нельзя, потому-что вы этого без тщательного code-review можете не заметить и создать баг.
2. С иммутабельностью ему просто компилятор этого сделать не позволит и он за пару дней поймёт что такое immutable variables / arguments / return values / methods / receivers
3. как-раз джуны делают ошибки с mutable shared state чаще всего, потому-что недостаточно понимают такие вещи как pointer aliasing (https://en.wikipedia.org/wiki/Pointer_aliasing)
4. вы считаете что копирование красивее и с ним меньше boilerplate'а?
func (rec *T) ReadOnly(s []*Object) [] *Object {
s_copy := make([] *Object, len(s))
for i, item := range s {
// Clone must create an exact copy of *Object to avoid aliasing
s_copy[i] = item.Clone()
}
// Pass copy to third-party function
thirdparty.Dependency(s_copy)
// now return an internal slice, but copy it to prevent mutations
internal_copy := make([] *Object, len(rec.internal))
for i, item := range rec.internal {
// Clone to avoid aliasing
internal_copy[i] = item.Clone()
}
return internal_copy
}
вы сильно ошибаетесь:
func (rec * const T) ReadOnly(s [] * const Object) [] * const Object {
thirdparty.Dependency(s)
return rec.internal
}
или же вот так:
type ConstSlice [] * const Object
func (rec * const T) ReadOnly(s ConstSlice) ConstSlice {
thirdparty.Dependency(s)
return rec.internal
}


eugene
08.09.2018
16:52:38
я правильно понимаю, что вы предлагаете решение проблемы, когда в более 2-х потоках одновременно записывается значение одной переменной?

Daniel
08.09.2018
16:53:23
нет
это совсем другая проблема

Pavel
08.09.2018
16:53:35

Daniel
08.09.2018
16:54:07
на самом деле - в первую очередь человек хочет запретить менять то, что меняться не должно, себе

Roman
08.09.2018
16:54:46

eugene
08.09.2018
16:55:36

Daniel
08.09.2018
16:55:41
(ну или вот я, как тимлид - когда я тимлид - хочу запретить тиме писать код с глобальным стейтом мутирующим)

eugene
08.09.2018
17:00:11
то есть вот это: concurrent access to shared mutable state

Roman
08.09.2018
17:01:18
а я думал, что mutable shared state связан с тем, что из множества потоков одновременно записываются значения в одну переменную
shared state = состояние, которое делится между несколькими акторами.
акторы могут быть как функции, так пакеты, так и потоки.
Помогает ли иммутабельность при написании потенциально конкурентного кода?
Да, потому-что у нас есть гарантия того, что то, что помечено иммутабельным, менять нельзя, а значит нельзя будет пообещать n потокам что ты не будешь писать в X и всё-равно это сделать
Иммутабельность это только про конкурентность?
Нет, это скорее про ещё более точно определённые типизированные интерфейсы. Если каким либо стейтом делятся несколько функций разных вендоров (не конкурентно) то мутабельность может порадить страшные баги потому-что кто-то, где-то накосячил


eugene
08.09.2018
17:03:20
shared state = состояние, которое делится между несколькими акторами.
акторы могут быть как функции, так пакеты, так и потоки.
Помогает ли иммутабельность при написании потенциально конкурентного кода?
Да, потому-что у нас есть гарантия того, что то, что помечено иммутабельным, менять нельзя, а значит нельзя будет пообещать n потокам что ты не будешь писать в X и всё-равно это сделать
Иммутабельность это только про конкурентность?
Нет, это скорее про ещё более точно определённые типизированные интерфейсы. Если каким либо стейтом делятся несколько функций разных вендоров (не конкурентно) то мутабельность может порадить страшные баги потому-что кто-то, где-то накосячил
понятно


Стас
08.09.2018
17:30:16
вопрос о правильности подхода: встретил комментарий на редите "Also, Go is a "Get Shit Done" language: you don't design Go programs as you would design a Java project. You write the code, prove it works, then generalize and clean up the mess. What you're left with is clean, idiomatic Go." т.е. автор, как я понял за то, чтобы написать по каким-то эскизам код, потом посотреть на него, почистить всякое дерьмо, потом снова посмотреть на код и т.д.
вы придерживаетесь такого принципа?

Roman
08.09.2018
17:34:59
https://github.com/romshark/Go-2-Proposal---Immutability#39-doesnt-the-const-qualifier-add-boilerplate-and-make-code-harder-to-read

Google

Roman
08.09.2018
17:36:15
вопрос о правильности подхода: встретил комментарий на редите "Also, Go is a "Get Shit Done" language: you don't design Go programs as you would design a Java project. You write the code, prove it works, then generalize and clean up the mess. What you're left with is clean, idiomatic Go." т.е. автор, как я понял за то, чтобы написать по каким-то эскизам код, потом посотреть на него, почистить всякое дерьмо, потом снова посмотреть на код и т.д.
да, вот только копирование не уберёшь никак))) ибо в месте с ним уберёшь безопасность... а "get shit done" это не синоним "тяк хуяк и так сойдёт"

Daniel
08.09.2018
17:46:46
вы придерживаетесь такого принципа?
вообще-то да. java провоцирует over-engineering, и это давно известный печальный факт
go местами провоцирует under-engineering, но это настолько очевидно, что тимлид легко даст вам по рукам

snip
08.09.2018
17:47:02
Идея с const нежизнеспособна и не потому что иммутабельность не нужна, а потому что в том виде как он описан в пропозале он выглядит чужеродным в го.
Го это простота на грани примитивности, многие правильные концепции сюда не завезли не потому что они не нужны, а потому что не нашли как их реализовать так же просто как и все остальное в го.
Если хочется правильных и нужных концепций пишите на раст

Roman
08.09.2018
17:49:09

snip
08.09.2018
17:50:02

Roman
08.09.2018
17:50:16

snip
08.09.2018
17:51:28
const * const это сложно
И уродливо

Daniel
08.09.2018
17:51:59
> Если хочется правильных и нужных концепций пишите на раст
вот откуда эта уверенность?
нам что, уже дали большой проект на расте? мы что, уже убедились, что в нем правильные абстракции и нужные концепции?
все, что я слышал про попытки применения раста в проде (я слышал мало), заканчивалось словами "оно падало, стектрейс был неинформативен". в 1/3 случаев за этим следовало "и мы переписали все на go"

Roman
08.09.2018
17:52:02

snip
08.09.2018
17:52:24
Но спорить я не хочу я высказал мнение, а уж прав или нет покажет время

Roman
08.09.2018
17:53:31

snip
08.09.2018
17:53:39