Je
если бы я читал код одного пакета, где 50/50% передача по указателю и по значению я бы подумал, что аффтар мудак, или я не прав?
Roman
interface = struct{*itab, unsafe.Pointer}
Roman
в интерфейсе всегда ссылка (явно и неявно)
Cat
ребят, подскажите, как в go dep зафиксировать версию на определённом коммите?
Cat
Vladislav
Илья
да
Cat
спасибо
Je
Cat
это, к сожалению, не я решаю
Vladislav
Кстати. Кто в курсе почему синтаксический сахар с вызовом метода определенного по указтелю с ресивером - структурой есть, а с передачей в интерфейс нет?
Vladislav
Пример: https://play.golang.org/p/TsFJD9wkeIq
Cat
Cat
как ты разыменуешь интерфейс?
Cat
бл*, кто может вместо меня нормальными словами объяснить?
Илья
не знаю, как объяснять, но нет, за вас p в &p компилятор не будет делать
Vladislav
Я к тому, что вызвать метод, определенный по указателю если ресивер структура можно. А привести к интерфейсу нет.
Vladislav
Илья
для метода компилятор сделает &p в момент вызова на истанциированом объекте
Vladislav
Тогда почему нельзя сделать &p на присваивании к интерфейсу?
Vladislav
Слишком неочевидно?
Антон
Копирование указателя в го происходит быстрее, чем копирование структуры, т.к. указатель в го - это _структура_ которая копируется (вот так вот, да) и в которой хранится тип и адрес уже непосредственно данных в памяти. А вот обращение к данным по ссылке конечно медленее - цена за разыменовывание. В го ГЦ работает не так, как в дотнете или жаве. В дотнете, объекты ГЦ маркируются тремя генерациями, всякие локальные переменные и мелкая требуха попадает в первую генерацию и чиститься первее всех. В го же оптимизация происходит на этапе компиляция, которая называется Escape Analysis, суть в которой, что многие объекты выделяются не на куче, а на стеке и сразу уничтожаются, что обнаруживается семантическим анализом их использования компилятором.
Передавать по ссылке версус Передавать по значению
Преждевременная оптимизация зло, потому ориентироваться на недокументированные оптимизации компилятора и гадание выделится ли структура на стеке или в куче не имеет смысла.
Я выработал концептуально такую систему:
1. Передавать структуру по значению, если мы предполагаем ее использование как иммутабельную (но тут не забывайте, что мапы и слайсы все равно будут мутабельны)
2. Передача ссылки предполагая, что объект будет изменяться функцией, в которую мы ее передаем
3. Понимать указатель как nilable (nullable) значение, чтобы проверить, мол не проинициализировано ли значение
4. Использовать указатели когда надо избежать копирования
В общем, как-то так
Эх, если бы только можно было явно указать, что значение иммутабельно передаётся по ссылке. Но это только мечты...
Artem
ну если добавить &property{}, то оно скомпилируется, так как операция Set не определена для func (p property), а определена только на func (p *property), что по факту является разным поведением
Artem
то, что (p property) стоит отдельно не отменяет того, что это просто еще один аргумент функции
Vladislav
Artem
и объявив type A func(p property, v interface{}), функцию Get можно прятать за этим типом
Антон
Vasily
это видео-курс
Vasily
читать тоже можно, там есть конспекты лекций
Oleh
Distributed Computing with Go
V.N. Nikhil Anurag
2018
Pawel
Pawel
Diasko
День добрый, возникла проблемка. При отправки POST в теле Body получается набор символов вместо нормально ответа. Типо такого PFRLS1BHPjxSZXNwb25zZT48T3BlcmF0aW9uPkNyZWF0ZU9yZGVyPC9PcGVyYXRpb2
Если вызвать через curl -d "<TKKPG><Request>...</Request></TKKPG>" https://epaypost.xxx.com/Exec то нормальный ответ в xml приходот
Diasko
tr := &http.Transport{
MaxIdleConns: 10,
IdleConnTimeout: 30 * time.Second,
DisableCompression: true,
}
client := &http.Client{Transport: tr}
req, err := http.NewRequest(
"POST",
url,
strings.NewReader(byteXml),
)
req.Header.Add("Content-Type", "text/xml; charset=UTF-8")
resp, err := client.Do(req)
content, _ := ioutil.ReadAll(resp.Body)
Artem
Похоже на base64 encoded
Diasko
Artem
Ну так размотай его, есть пакет encoding/base64
Diasko
проверил через curl и wget везде в ответ приходит xml, а тут base64
Artem
Ну так курл наверное его уже прогоняет через base64
Stanislav
доброго времени суток, товарищи. Тут с CouchDB в связке с Go кто работал? Как она? Штабильна?
Diasko
Нашел в чем косяк, оказывется сам дурак 😂
Anonymous
Книга из серии Обо всё и ни о чём конкретно. Да и чел странный— на обложке "Про канкаренси и параллелизм", внутри— микросервисы.
Про concurency лучше книги Catrin Cox нет. Если интересует именно канкаренси @Cybercommunist
Anonymous
А из серии Распределенных систем, если не суровую математику, а инженерные подходы, то мне очень понравилась https://www.amazon.com/Designing-Data-Intensive-Applications-Reliable-Maintainable/dp/1449373321
Roman
Brother
Что думаете по поводу этой статьи (но в контексте Go)?
https://medium.com/saveboost/how-i-chose-our-startup-stack-70ddd8e164b
Какой вы бы стек выбрали для стартапа/пэт-проджекта?
🏁Александр
лучше посмотреть как в ядре все это работает, в плане гоу
🏁Александр
часто вопросы про "как работаю гоурутины" "чем отличаеются от потоков"
🏁Александр
var i TestInterface
var t *Test
i = t
и почему i не nil 🙂 Вчера подловили на этом
Anonymous
кстати, на собеседовании меня практичаески всегда спрашивают за сортировку массива.
я там чё-то отвечаю и спрашиваю интервьюера - а вам это с какой целью? что, вас нустраивает та сортировка которая в языке есть и вы хотите её переписать? И, очевидно же что там сортировка написана не в тупую, как может изложить собеседуемый, а алгоритм усложнённый, дополненный. Понятно, что никто ответить не может.
Alexander
🏁Александр
гоурутины это надстройка по управлению потоками
🏁Александр
можно так 🙂
🏁Александр
"система очередей к потокам"
Alexandr
https://habr.com/post/333654/
https://habr.com/post/141853/
Alexandr
вот две хорошие статьи на эту тему)
Alexandr
Всем привет! Подскажите как лучше организовать такую вещь: Есть данные которые должны переодически обновляться из редис. Эти данные используются в разных местах(только чтение) и обновляться будут через метод update. Ну как хранить эту структуру? переменную пакета?
Сейчас я сделал так, https://play.golang.org/p/2h3Fuh8GsuG
Alexandr
Anonymous
само собой, если задать
var i Test
var t *Test
то i = t не будет работать потому что поинтер
Anonymous
но факт ещё в том что сами типы данных отличаются )
Alexandr
🏁Александр
https://play.golang.org/p/JYhQnhDW_pc
🏁Александр
вот вам
Alexandr
вот вам
тоже набросал уже) ну если вывести через println то будет nil
Anonymous
вот не понятно
🏁Александр
fmt.Printf("%t %t", i, t)
Alexandr
https://play.golang.org/p/PqeMXn3Wczp
Anonymous
если fmt.Println(i == nil) выдаёт false то почему fmt.Println(i) выдаёт nil
🏁Александр
что еще больше вас запутать 🙂
🏁Александр
https://play.golang.org/p/FDmWKi9bLqA