Задать вопрос
  • Из-за чего, когда я конвертирую байты в строку и обратно, то байты отличаются?

    2ord
    @2ord
    Ничего удивительного.
    В документации указано что делает %x в Sprintf.

    Если нужно убедиться в корректности в строке, то использовать strings.ToValidUTF8.
    Ответ написан
    Комментировать
  • Как организовать работу микросервисов в kafka?

    2ord
    @2ord
    Почему Kafka? Почему микросервисы?
    1. Принимает запрос и отправляет его в kafka.
    От кого принимает и каким образом? Какой выдается ответ и каким образом?
    Нужно разделить интернет-магазин на логические части. Проверить какие запросы могут обслуживаться синхронно, а какие - отложенно (асинхронно).
    Когда на складе остается мало товара, пользователь должен знать об этом. Еще можно показывать наличие товара только если имеется свыше X единиц. А с точки зрения СУБД можно применить оптимистическую блокировку записи.
    Ответ написан
    Комментировать
  • Go run автоматическая пересборка при изменении кода?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Я использую github.com/cespare/reflex для автоматической сборки при изменении кода, очень удобно
    Ответ написан
    Комментировать
  • Почему не получается сравнить отрицание в switch?

    @Asokr
    Так как вы хотите сделать не получится если отсутствует break, проверка не выполняется - отрабатывают все инструкции после первого true.
    Ответ написан
    Комментировать
  • Как захешировать строку согласно ГОСТ 34.311, чтобы это была строка в base64?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    А зачем нужны библиотеки?
    let data = '12345678901234567890123456789012';
    let base64data = Buffer.from(data).toString('base64');
    
    console.log(base64data); // MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=
    Ответ написан
    Комментировать
  • IDE GoLand: Как убрать подсветку синтаксиса для не используемых переменных?

    Эту подсветку синтаксиса отключить нельзя, поскольку язык Go не разрешает оставлять неиспользуемые переменные в коде, что позволяет часть других языков, происходит ошибка компиляции.
    Ответ написан
    1 комментарий
  • Есть ли разница между горутинами и await в C#?

    Tyranron
    @Tyranron
    Несмотря на то, что эти инструменты созданы для решения одних и тех же проблем, делают они это по-разному, как под капотом, так и в плане предлагаемых абстракций. Потому нельзя сказать что async/await в C# - это "просто обертка над горутинами".

    Горутины в Go - это концепция stackful coroutines (под капотом) + CSP (в абстракциях). Каждый раз, когда мы создаём горутину, под неё выделяется отдельный стек вызовов для её собственных нужд. При этом, когда происходит паника, то stack unwinding (размотка стека вызовов) происходит только в пределах этой горутины и не покидает границ её стека. Стек горутины полностью отвязан от стека её создания/вызова, потому горутина не может возвращать результат. Любое общение между горутинами выполняется либо посредством каналов, либо какой-то общей памяти.

    async/await в C# (то есть, Task'и) - это концепция stackless coroutines (под капотом) + futures (в абстракциях). Код с async/await'ами компилятор превращает в определенную стэйт-машину с yield point'ами. У них нет отдельного стека, они выполняются в том же стеке что и вызывающий их код. Соотвественно, есть возможность словить exception'ы (аналог panic'и) возникающие внутри асинхронного Task'а прямо в запускающем его коде. Так как выполнение идёт на том же стеке - Task нормально может возвращать результат и мы его можем считать в вызывающем коде без дополнительных примитивов/инструментов.

    При этом, если мы запустим Go с GOMAXPROCS=1, то мы получим однопоточный асинхронный код в Go (по умолчанию он многопоточный). Также и в C# мы можем выполнять Task'и как на одном потоке, так и на thread pool, получая аналогичные Go гарантии рантайма.

    С точки зрения абстракций/использования - это уже вкусовщина. Кому как больше нравится. У futures лучше дизайн в плане composability (их эргономичнее join'ить и select'ить), но они вынуждают писать везде async и await. У горутин надо постоянно городить чехарду с синхронизацией (попробуйте сделать аналог await для произвольной горутины), но если эту чехарду прятать под капот (как обычно и делают), то код вообще выглядит полностью синхронным и программисты радуются.
    Ответ написан
    4 комментария
  • Как на golang создать запароленный архив?

    REKTOR_RG
    @REKTOR_RG
    contents := []byte("Hello World")
    
    // write a password zip
    raw := new(bytes.Buffer)
    zipw := zip.NewWriter(raw)
    w, err := zipw.Encrypt("hello.txt", "golang")
    if err != nil {
        log.Fatal(err)
    }
    _, err = io.Copy(w, bytes.NewReader(contents))
    if err != nil {
        log.Fatal(err)
    }
    zipw.Close()

    А вот так можно читать архив с паролем [спойлер]
    // read the password zip
    zipr, err := zip.NewReader(bytes.NewReader(raw.Bytes()), int64(raw.Len()))
    if err != nil {
        log.Fatal(err)
    }
    for _, z := range zipr.File {
        z.SetPassword("golang")
        rr, err := z.Open()
        if err != nil {
            log.Fatal(err)
        }
        _, err = io.Copy(os.Stdout, rr)
        if err != nil {
            log.Fatal(err)
        }
        rr.Close()
    }

    Создаст архив в формате .zip с файлом hello.txt и паролем golang
    Взято с официальной документации (от сюда).
    Ответ написан
    Комментировать
  • Как создать cookie для запроса?

    uvelichitel
    @uvelichitel Куратор тега Go
    habrahabr.ru/users/uvelichitel
    import (
    "net/http"
    "net/http/cookiejar" //из этого пакета
    )
    ...
    jar, err := cookiejar.New(options)
    if err == nil {
        coocies := []http.Coocie{{Name: "token", Value: token}} //здесь собрать
        jar.SetCookies(url, coocies) //здесь привязать к Url
    }
    
    client := http.DefaultClient //как вложить токен в куки при отправке запроса?
    client.Jar = jar //здесь выдать клиенту
    ...
    Ответ написан
    Комментировать
  • Стоит ли переплатить за процессор?

    @Akela_wolf
    Extreme Programmer
    Смотрите, главное различие между ними это количество ядер
    У 5600G - 6 ядер/12 потоков
    У 5700G - 8 ядер/16 потоков

    Еще у 5700 более мощная видеокарта встроена.

    Собственно далее вопрос: у вас, в вашей нагрузке будет чем утилизировать эти дополнительные 2 ядра/4 потока? Это либо задачи, которые хорошо параллелятся, либо большое количество процессов (виртуальные машины, например). Я в свое время взял 1700 первого поколения именно из-за этих дополнительных ядер по сравнению с 1600. Собственно никаких проблем с пиковой загрузкой проца не имею. Может быть хватило бы и 6 ядер, может быть и 4. Но, поскольку комп я брал надолго (и мне его более чем хватает на данный момент), то решил брать максимально доступную конфигурацию (был еще Threadripper, но его цена чуть более чем неприличная).

    Занимаюсь разработкой на Java и время от времени играю в не особо требовательные игры.

    Лично я при таких условиях взял бы 5700, но решать разумеется вам.
    Ответ написан
    Комментировать
  • Как вывод в консоль дожидается выполнения async функции?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    async func() всегда возвращает промис.
    И в консоль выводится именно этот промис со статусом pending.
    После завершения fetch и json статус промиса изменится на fulfilled и ему добавится значение.
    Вот вывод консоли сразу после console.log:
    Promise { <state>: "pending" }
    Если через некоторое время раскрыть этот объект, то увидим, что его статус уже сменился (вы ведь помните, что в консоль выводится живой объект по ссылке):
    Promise { <state>: "pending" }
    ​  <state>: "fulfilled"
    ​  <value>: Array(10) [ {…}, {…}, {…}, … ]
    ​  <prototype>: Promise.prototype { … }
    Ответ написан
    7 комментариев
  • Golang в чём смысл?

    1. Go был придуман в гугле для решения задач Гугла ещё задолго до того, как появился .net core со всем его перформансом.
    2. Go всё ещё порождает более компактные и не зависящие от окружения бинарники.
    3. Чтобы C# показывал результаты как в techempower - нужно писать код так, как никто его не пишет в реальном мире.
    В бэклоге . net команды даже пункты отдельные есть за то чтобы быть топ1 в бенчмарках
    4. Go всё ещё гораздо проще Шарпа, ибо п1
    Ответ написан
    Комментировать
  • Golang в чём смысл?

    bingo347
    @bingo347
    Crazy on performance...
    Во-первых, любой бенчмарк можно написать так, что визуально будет выглядеть очень похоже, но на деле у одной технологии будут использоваться сильные стороны, а у другой нет (понятно кто выиграет). Притом это можно сделать как специально, дабы превознести одну из технологий, так и ненамеренно, просто потому-что человек писавший бенчмарк очень хорошо знает одну технологию и посредственно другую.
    Например, я вполне умею написать многие вещи на C, C# и Go, но знаю эти языки очень поверхностно, с другой стороны я очень хорошо знаю JS (в том числе достаточно много копался в кишках v8) и Rust, как думаете, кто победит, если я начну писать бенчмарки для сравнения этих 5 языков?

    хотя Golang изначально и задумывался, как яп для хайлоада
    Go изначально задумывался как ЯП, который сможет быстро освоить любой, кто базово знаком с программированием, дабы Google мог нанять тысячу джунов и они быстро прототипировали идеи без заморочек C/C++.

    А еще вся супер-пупер параллельность - на самом деле асинхронщина, работающая на небольшом пуле реальных потоков ОС. Притом без вариантов. Асинхронный рантайм - это тоже не бесплатно. На всяких I/O штуках асинхронщина показывает себя очень хорошо, но на сугубо вычислительных задачах - все ее преимущества становятся минусами. На шарпе есть контроль, где использовать асинхронщину, а где вынести вычисления в настоящий поток. На Go такой возможности нет.

    P.S. а вообще, в реальном мире Вы практически никогда не упретесь в производительность языка, ну разве что будете всюду втыкать самые неоптимальные алгоритмы. На деле бутылочным горлышком окажутся сеть и диски. И даже в сугубо вычислительных штуках Вы скорее упретесь в оперативку и процессорные кэши, а не в ЯП.
    Ответ написан
    2 комментария
  • Какую связку мать + проц из предложенных посоветуете?

    irishmann
    @irishmann
    Научись пользоваться дебаггером
    AMD
    Ответ написан
    Комментировать
  • Как обычно логируют краши от паник?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Если говорить про http сервер - я перенял практику из Django.

    У меня есть http middleware, который:
    - вызывает recover
    - нормально отвечает на запрос, а не падает, т.е. 500 + что мы уже знаем об ошибке и работаем над её устранением
    - собирает всю информацию по запросу, http заголовки, cookies, настройки сервера, переменные окружения и т.д. и оповещает меня по почте/телеграм

    Это даёт мне возможность узнавать о проблеме до того, как кто-то напишет в поддержку.

    Люди, в хорошем смысле, удивляются, когда у них что-то не получается, сервер отвечает 500, они не поймут что делать. А я уже узнал об этом, исправил ошибку и написал им письмо о том, что была ошибка, но уже всё исправлено :)
    Ответ написан
    Комментировать
  • Как создать переменую областью видимости пакета,чтобы не видели другие горутины и без их блокировки?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Можно сделать что-то тапа такого.
    Реализация не очень красивая, но, думаю, это даст вам понимание в каком направлении можно двигаться.
    package pkg2
    import "fmt"
    
    type Pkg2 struct {
         str2 []string
    }
    
    func New() *Pkg2 {
        return &Pkg2{
            str2: []string{},
        }
    }
    
    func (p *Pkg2) Test(str string){
        p.str2 = append(p.str2, str)
        fmt.Printf("str:%v %v \n", str, p.str2)
    }


    package main
    
    import (
      "sync"
      "pkg2"
    )
    var wg sync.WaitGroup
    
    func main() {
      text:=[]string{"a1", "a2", "a3", "a4", "a5"}
      for i,str:=range text{
        wg.Add(1)
        p := pkg2.New()
        go start(str, p)
      }
      wg.Wait()
    }
    
    func start(str string, p *pkg2.Pkg2){
        p.Test(str)
        wg.Done()
    }
    Ответ написан
    3 комментария
  • Совместимы ли Golang и Machine Learning?

    @dmshar
    Давайте разделим - мухи отдельно, а котлеты отдельно.
    Вопрос первый:
    "Совместимы ли Golang и Machine Learning?" - Ответ "да". Существуют решения для МL и на Go, и на Python, и на С# и на Java, и даже на PHP и JavaScript. А если учесть, что процентов 80 инструментов для МL реализованы на С++ то и он задействован.
    Вопрос в том, на чем чаше работают при решении задач ИИ и ML - это уже совсем другой вопрос.
    Вопрос второй:
    "можно ли мне их будет совмещать в дальнейшем, чтобы работать сразу в двух направлениях." Если под "их" вы понимаете Go и ML - то см. выше. А если "backend" и ML - скорее всего нет. Впрочем, есть такая специальность, как "Machine Learning engineer" или еще говорят "Специалист по дата-инженерии". Там могут оба навыка как-то сблизиться и где-то пересечься. Но это не чистый "backend" и не чистое Машинное обучение. Посмотрите в эту сторону.
    Вопрос третий:
    "Не знаю, что выбрать backend разработку на Golang или Machine Learning" (кстати, а тут уже вы Go противопоставили МL - это случайность?)
    Вот тут за вас никто не решит, и не стоит перекладывать ответственность на других. Посмотрите, почитайте - благо в интернете на эту тему написано столько, что ни на одном форуме вам не расскажут что-то новое. Подумайте, что вам больше нравиться, к чему больше тянет. Вообще говоря это разные сферы - одна чисто технологическая, вторая скорее статистическо-математическая, где программирование используется только как инструмент. Не факт, что вы настолько разносторонне и равномерно подготовлены, что почувствуете себя одинаково комфортно в обоих сферах. И принимайте решение. Самостоятельно! Без оглядки на советы непонятно кого, с непонятно каким опытом и образованием.
    Удачи.
    Ответ написан
    Комментировать
  • Как вытянуть id и текс сообщения в телеграме на go?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Вот тут расписаны все поля структуры Message https://pkg.go.dev/github.com/go-telegram-bot-api/...

    Пример того, как можно получить нужные вам данные
    package main
    
    import (
    	"log"
    
    	tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
    )
    
    func main() {
    	bot, err := tgbotapi.NewBotAPI("MyAwesomeBotToken")
    	if err != nil {
    		log.Panic(err)
    	}
    
    	u := tgbotapi.NewUpdate(0)
    	u.Timeout = 60
    
    	updates := bot.GetUpdatesChan(u)
    
    	for update := range updates {
                if update.Message == nil { // не обрабатываем если нет сообщения
                    continue
                }
    
                // ID сообщения, int
                log.Printf("message id: %s\n", update.Message.MessageID)
    
                // так вы можете получить текст сообщения полный (тип string)
                log.Printf("message: %s\n", update.Message.Text)
    
                if update.Message.IsCommand() {
                    // так вы получаете команду
                    log.Printf("command: %s\n", update.Message.Command())
    
                    // так вы получаете аргументы (параметры) команды, string
                    log.Printf("command: %s\n", update.Message.CommandArguments())
                }
            }
        }
    }
    Ответ написан
    Комментировать
  • Какие плюсы с перехода на react c vue?

    yarkov
    @yarkov Куратор тега JavaScript
    Помог ответ? Отметь решением.
    Но я считаю что на реакте будет лучше.

    Скажите просто несколько доводов в сторону реакт.

    Вот вы нам и скажите )) Вы же говорите что на реакте лучше. Особенно про слабые библиотеки интересно услышать доводы.
    Ответ написан
    4 комментария
  • Какие плюсы с перехода на react c vue?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Перейдя на реакт вы будете страдать. Реакт - это тупо даунгрейд. Всё то же самое, но хуже и местами отсутствует. Есть ли в нём хоть какие-то преимущества перед vue? Не знаю таких.
    Что за проблемы у вас с библиотеками?
    Ответ написан
    2 комментария