Задать вопрос
  • Почему выдает ошибку - переменная input объявлена, но не используется?

    Lynn
    @Lynn
    nginx, js, css
    Потому что переменная input объявлена, но не используется.
    Внутри for вы используете оператор := который объявляет локальные переменные input и error. А та, которую вы объявили выше тут не используется.

    https://golangdocs.com/short-variable-declaration-...
    Ответ написан
    Комментировать
  • Многократное использование len() или кеширование в переменную?

    uvelichitel
    @uvelichitel Куратор тега Go
    habrahabr.ru/users/uvelichitel
    А зачем вообще может понадобиться такая конструкция когда есть встроенный оператор
    for i:= range data {}
    компактно и идиоматично
    Ответ написан
    Комментировать
  • Как убрать проверку импортированных модулей go с официальным расширением?

    2ord
    @2ord
    Начиная с версии 1.11, используются Go modules.
    При этом нет необходимости использовать ни GOROOT, ни GOPATH.
    Для удовлетворения зависимостей предпочитаю использовать go mod tidy.
    Ответ написан
    Комментировать
  • Go get - connection refused, какие порты открывать?

    ky0
    @ky0 Куратор тега Системное администрирование
    Миллиардер, филантроп, патологический лгун
    Помимо HTTP(S), нужно как-то отрезолвить хосты, с которых предполагается скачивание - это ещё, как минимум, DNS.

    Вообще, по-хорошему, это не ваше дело - разбираться, чего не хватает. Нормальный ИБ-отдел должен понимать задачи, сформулированные человеческим языком, вроде "мне нужно мочь скачивать информацию из интернета по HTTP, конкретно - зависимости для проекта из репозиториев".
    Ответ написан
    Комментировать
  • В чем сложность поддержки проектов на Go?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Более четырёх лет пишу на Go, лично для меня поддерживать проекты на других языках сложнее ))
    До Go много лет писал на Perl/PHP/Python/Java/C/Ruby on rails/JavaScript и "крутил" еще не мало чего.
    Сейчас пишу только на Go и Python.

    Основная сложность в Go - это то, что если вы начинаете писать "криво" - то писать так очень трудно :))
    Подход к реализации в Go достаточно непривычный для тех, кто приходит из скриптовых языков.
    Например запрет циклических импортов - это самое первое, что "взрывает" мозг :)
    Нужно время чтобы адаптироваться после скриптовых языков.

    Про обработку ошибок - это да, это, пожалуй, единственное что мне не нравится в Go.
    Для себя я решил эту проблему за 1-2 часа :) и больше меня это не беспокоит.

    По ООП - в Go оно есть, лично мне оно нравится намного больше, чем ООП в других языках ))
    Всё, что реально нужно - всё есть, но при этом ничего лишнего нет.
    Интерфейсы - просто прекрасны :)) Каналы, горутины - это просто "счастье" :))

    А если объективно - то я бы не стал говорить о сложности поддержки проекта применимо к какому то конкретному языку.

    Как правило сложность поддержки возникает там, где нормальная архитектура не заложена в проект.
    Т.е. проект как могла так и писала куча людей плюс, как обычно, сделать нужно было побыстрее )), от этого никто вообще не думал об архитектуре и получилось то, что получилось :))
    Про покрытие тестами и документацию мы вообще не говорим )))

    А когда в таком проекте нужно что-то доработать или исправить ошибку, то почти всегда очень не просто найти то место, где нужно править, и после правок в одном месте, как правило, что-то ломается в другом :)

    Как минимум, нужно соблюдать принципы SOLID, иначе код получается, мягко говоря, не поддерживаемым.
    Но понимание этих принципов так же приходит с опытом, их нельзя научиться соблюдать просто прочитавши книгу или статью. Нужно сделать несколько проектов используя эти принципы, написать криво, понять как было бы правильно, всё переделать и так несколько раз.
    Тогда, со временем, начнёт получаться понятный и легко поддерживаемый код.

    Так мы приходим к тому, что если опыта нет - тогда проект поддерживать будет достаточно тяжело не взирая на язык и т.д.

    Хочется добавить, что как бы не писали про Go, что он простой и т.д. - он явно сложнее Python/PHP и т.д.
    Это еще один повод сказать, что поддерживать код на Go сложно ))

    Также стоит учитывать, что проекты которые пишут на Go зачастую сложнее, чем проекты для которых выберут скриптовый язык. Go выбирают когда планируются большие нагрузки, параллельная обработка чего-либо и т.д., а это, в свою очередь, дополнительно усложняет проект.
    Ответ написан
    7 комментариев
  • Как начать заниматься 3D-моделированием?

    Zoominger
    @Zoominger
    System Integrator
    И стоит ли покупать курсы на всяких платформах именитых?

    Нет.
    Если не умеете читать, то можно погуглить на том же Ютубе массу хороших видеоинструкций от профессионалов.
    Если читать умеете, то качайте любую популярную книгу по 3D-моделированию и читайте её.
    Ответ написан
    Комментировать
  • Как правильно передать множество параметров в функцию в Golang?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    В таких случаях лучше передавать структуру как параметр.
    Пример
    type User struct {
        Name string
        Email string
        // все нужные поля далее
    }
    
    func CreateUser(r.Context(), user)
    Ответ написан
    Комментировать
  • Могу ли я продавать чужие 3D-модели?

    Zoominger
    @Zoominger
    System Integrator
    Нет.
    Нарушает.
    Наказуемо.
    Вы же просто воруете чужой труд и пытаетесь срубить на этом лёгких денег.
    Но деньги лёгкие, а бутылочка тяжёлая.
    Ответ написан
    2 комментария
  • Почему при отправке письма выдает ошибку?

    @PapaStifflera
    Родился, вырос...
    Потому, что хост - это smtp.mail.ru
    Ответ написан
    1 комментарий
  • Как преобразовать тип string в time?

    udjin123
    @udjin123
    PHP, Golang, React
    package main
    
    import (
        "fmt"
        "time"
        "strconv"
    )
    
    func main() {
        i, err := strconv.ParseInt("1632896473", 10, 64)
        if err != nil {
            panic(err)
        }
        tm := time.Unix(i, 0)
        fmt.Println(tm.Unix())
    }
    Ответ написан
  • Как поставить задержку во время выполнения горутин?

    yellow79
    @yellow79
    Senior Software Engineer
    Для таких целей есть https://pkg.go.dev/golang.org/x/time/rate
    Ответ написан
    Комментировать
  • Deadlock - возникает блокировка, из-за чего она происходит?

    Вижу такую проблему:
    1. Вы создаете небуферизированный канал done.
    2. Функции, пытающиеся записать в канал done блокируются, пока канал не будет прочитан.


    Предлагаю такое исправление - в функции main запускать SingleHash(done, in[1:]) как горутину, чтобы не блокировать main и перейти к ожиданию ответа из канала done. И в данном случае go func(done chan interface{}) нужно будет выполнить синхронно, а не горутиной.
    Ответ написан
    1 комментарий
  • Почему Golang устанавливает пакеты не туда?

    udjin123
    @udjin123
    PHP, Golang, React
    С версии 1.6 включены по дефолту модули, регулируется этой GO111MODULE переменной окружения, если нужно старое поведение то установите ее off, подробнее тут https://go.dev/blog/go116-module-changes
    Но лучше мигрировать на модули
    Ответ написан
    3 комментария
  • Как понять когда ставить указатель?

    samodum
    @samodum
    Какой вопрос - такой и ответ
    По мере необходимости.
    Рекомендую почитать сначала теорию о том что такое указатели, переменные, типы и структуры данных.
    Без базовых понятий ты далеко не уедешь
    Ответ написан
    Комментировать
  • Как понять когда ставить указатель?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Указатель, по сути, хранит адрес каких то данных (переменной, структуры, слайса и т.д.).
    Иными словами он "указывает" на область данных.

    Чтобы понять как им пользоваться - сначала нужно понять для чего он вообще используется.
    Представьте что у вас есть структура, которая содержит много разных полей, в которых содержится большой объём данных.

    Например:
    type BigStruct struct {
        field1 int
        filed2 string
        field3 uint
        field4 []byte
        ...
        field50 string
    }

    Предположим, что после создания этой структуры и заполнения всех её полей она занимает в памяти 300мб.

    Если вы сделаете функцию, которая будет принимать такую структуру как агрумент, например вот так
    func Report(s BigStruct)
    то при каждом вызове этой функции вся структура (300мб) каждый раз будут копироваться.
    Пример:
    s := BigStruct{}
    // заполняем поля
    Report(s)


    Чтобы избежать такой мега нагрузки - можно передавать не копию данных, а указатель, т.е. адрес в памяти, где хранится сама структура.
    Для этого нужно объявить агрумент функции как указатель, т.е. ставим *.
    func Report(s *BigStruct)
    А код уже будет выглядеть вот так.
    s := BigStruct{}
    // заполняем поля
    Report(&s) // тут добавился & - берём адрес структуры, а не саму структуру

    Или второй вариант
    // создаём переменную s сразу с типом указатель на BigStruct
    s := &BigStruct{}
    // заполняем поля
    Report(s) // поскольку s уже является указателем - & тут не нужен


    В общем * используется:
    - когда нужно объявить переменную
    var s *BigStruct
    - когда нужно прочитать/записать значение, которое храниться по адресу указателя
    var i *int
        i = new(int)
        *i = 10 // пишем значение
    
        fmt.Printf("i: %v\n", i)
        fmt.Printf("*i: %v\n", *i)

    Вывод будет примерно таким
    i: 0xc0000160d8 (это адрес памяти, где лежит значение переменной i)
    *i: 10 (а это её значение)


    & (амперсанд) используется когда нужно получить адрес переменный.

    Еще один вариант применения - если нужно иметь возможность модифицировать данные у параметра функции. Если нужны примеры - дайте знать, я напишу.
    Ответ написан
    12 комментариев
  • Как найти нормаль к плоскости по 3 точкам?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Нормаль к плоскости вычисляется как векторное произведение двух векторов, задающих плоскость. Для точек A, B, C можно взять векторы AB и AC.
    Ответ написан
    Комментировать
  • Как задать кодировку при запросе?

    Наверное, надо задать кодировку?

    Нет, это особенность сайта, к которому делается запрос, и на это повлиять нельзя.
    Это так в js можно кодировать символы юникода - в данном случае кириллицу.
    Написано там "оуцко"

    Для декодирования json следует использовать соответствующий модуль:
    https://pkg.go.dev/encoding/json
    Ответ написан
    5 комментариев
  • Почему парсинг на Golang тратит больше времени для выполнения работы, чем парсинг на Python?

    @kirillinyakin
    Судя по коду на голанге вы посещаете каждую страницу, а на питоне вы просто получаете атрибут href
    Ответ написан
    1 комментарий
  • Как узнать за какое время скомпилировалась программа на Golang?

    axifive
    @axifive
    Software Engineer
    Вам нужно засечь время исполнения.
    В Unix системах есть команда: timego ....
    В Windows PowerShell есть Measure-Command{start-process go ... }

    А дополнительную отладочную информацию можно получить с помощью флагов
    https://pkg.go.dev/cmd/compile#hdr-Command_Line
    Ответ написан
    Комментировать