• Как использовать строку в качестве названия функции в GoLang?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Добро пожаловать в мир компилируемых языков программирования и статической типизации, здесь такое не нужно, считается очень плохой практикой и достижимо только через чёрные ходы, вроде рефлексии, что снижает производительность и безопасность кода, а также усложняет его сопровождение.
    Ответ написан
    Комментировать
  • Какую формулу использовать?

    монеты могут быть в значении 0.0005

    Если это - минимальное значение, то перед началом расчётов домножаете всё на 10000 и далее спокойно округляете, без всякой арифметики с плавающей точкой.
    Ответ написан
    Комментировать
  • Возможно ли создать игру без движка?

    saboteur_kiev
    @saboteur_kiev Куратор тега Разработка игр
    software engineer
    конечно. Так раньше все игры и делали.
    Потом каждый писал свой движок и делал.
    Потом начали пользоваться чужими готовыми движками, ибо написать например трехмерный шутер с нуля, в одиночку займет несколько лет, при условии что ты очень крут и в алгебре и геометрии и в тонкостях работы современных возможностей видеокарточек и графических подсистем.

    А простенькие типа сапера - что там делать..
    Ответ написан
    Комментировать
  • Как правильно распарсить json?

    @12rbah
    В правый столбик тут нужно кинуть JSON а в левом будет сгенерирована нужная структура, которую можно будет использовать для маршалинга/анмаршалинга
    Ответ написан
    Комментировать
  • Как в goшном SOA сервисе работать с базой данных?

    Не знаю, какая у вас архитектура, но когда какая-то библиотека обрастает огромным количеством методов, то Go - это один из редких языков программирования, который, благодаря своей утиной типизации позволяет использовать шаблон проектирования "consumer interfaces", т.е. объявлять интерфейсы в месте, где они используются и включать в эти интерфейсы только те методы из огромной структуры базы данных, которые именно тут, на месте, и используются. Таким образом ваши интерфейсы будут минимальными, понятными, и искать их не придётся. Ну, и в добавок, старый добрый Dependency Injection решит массу наших проблем

    База данных:
    package db
    
    import "fmt"
    
    // Стуктура базы данных. Здесь нам даже и не нужно объявлять никаких интерфейсов
    type Service struct {
    	// ...
    }
    
    func NewDbService() (*Service, error) {
    	return &Service{}, nil
    }
    
    func (d *Service) CreateUser(username string, email string) {
    	fmt.Println(fmt.Sprintf("user %s with email %s is created", username, email))
    }
    
    func (d *Service) CreateProduct(name string) {
    	fmt.Println(fmt.Sprintf("product  %s is created", name))
    }


    Пользователь:
    package user
    
    // Тот самый интерфейс, который нам позволяет выбрать из структуры базы данных
    // только нужные нам здесь методы
    type dbUser interface {
    	CreateUser(username string, email string)
    }
    
    type Service struct {
    	db dbUser
    	// ...
    }
    
    func NewService(db dbUser) (*Service, error) {
    	return &Service{db}, nil
    }
    
    func (c *Service) New(username string, email string) {
    	c.db.CreateUser(username, email)
    }


    Товар:
    package product
    
    // Тот самый интерфейс, который нам позволяет выбрать из структуры базы данных
    // только нужные нам здесь методы
    type dbProduct interface {
    	CreateProduct(name string)
    }
    
    type Service struct {
    	db dbProduct
    	// ...
    }
    
    func NewService(db dbProduct) (*Service, error) {
    	return &Service{db}, nil
    }
    
    func (p *Service) New(name string) {
    	p.db.CreateProduct(name)
    }


    main.go
    package main
    
    import (
    	"test2/db"
    	"test2/product"
    	"test2/user"
    )
    
    func main() {
            // Инициализируем базу данных
    	dbService, _ := db.NewDbService()
            // Структура базы данных реализует интерфейс dbProduct, инжектим её
    	productService, _ := product.NewService(dbService)
            // Структура базы данных реализует интерфейс dbUser, инжектим её
    	userService, _ := user.NewService(dbService)
    
            // Пользуемся на здоровье...
    	userService.New("user1", "uswr1@example.com")
    	productService.New("product1")
    }
    Ответ написан
    Комментировать
  • Как организовать структуру проекта с несколькими модулями Golang?

    Делаем три разных файла main.go под каждый сервис. Кладём их каждый в свою подпапку в директории, например "cmd".
    А для общих библиотек используем отдельную директорию, например "pkg", и будем импортировать отсюда функционал во все три сервиса.

    Т.е. у нас получается структура файлов:
    cmd/
          repeater/
                main.go
          controller/
                main.go
          executor/
                main.go
    pkg/
          c-library/
                clibrary.go
    go.mod


    И потом запускаем компиляцию:

    go build ./cmd/repeater
    go build ./cmd/controller
    go build ./cmd/executor


    Пример main.go
    package main
    
    import c_library "test/pkg/c-library"
    
    func main() {
    	c_library.HelloWorld()
    }


    И общая библиотека:
    package c_library
    
    import "fmt"
    
    func HelloWorld() {
    	fmt.Println("HELLO WORLD")
    }


    Весь проект у меня лежит в папочке test, и в файле go.mod надо бы указать следующее

    module test
    Ответ написан
    5 комментариев
  • Почему не сетится значение из БД в структуру в поле uint?

    @calculator212
    Гугл с ошибкой не помог :(

    sql: Scan error on column index 1, name "i_size": converting driver. Value type int64 ("-10") to a uint8: invalid syntax
    Можно попробовать еще прочитать ошибку или засунуть ее в гугл переводчик.
    Проблема тут не с sqlx, а с тем, что ты хочешь запихнуть в поле uint отрицательное значение, на что база тебе выдает ошибку(так и должно быть). Если нужны отрицательные значения в базе то используй просто int
    Ответ написан
    Комментировать
  • Проблема с модификатором Solidify в Blender. Может кно нибудь подсказать в чем проблема?

    @Reynir Автор вопроса
    Я нашел решение сам. Оказалось что внутри меша были дупликаты я веделил все и нажал merge by distance. Обьединил иx.
    Ответ написан
    Комментировать
  • Можно ли (Как) установить модуль Golang из локального источника?

    @falconandy
    1. Можно включить вендоринг - тогда все зависимости будут размещены в подпапке vendor и при следующих сборках доступ в интернет не понадобится. go mod vendor
    2. Можно установить переменную GOPROXY так, чтобы исходники качались не через прокси proxy.golang.org, а через другой или напрямую с гитхаба. Environment variables
    3. Можно использовать уже скачанный локально репозиторий. replace directive in go.mod

    UPD: конкретно для go install можно попробовать п.2 с GOPROXY. Либо склонировать исходный репозиторий и собрать бинарник командой go build - для разрешения проблем с доступом к зависимостям воспользовавшись п. 1-3.

    UPD 2: по конкретно интересующему вас репозиторию: клонируете его, переходите в папку installer и выполняете в ней GO111MODULE=off go build, получите собранный бинарник - нет там никаких внешних зависимостей и даже go.mod
    Ответ написан
    1 комментарий
  • Как связать React + GoLang?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Так же, как бэкенд на любом языке и фронтенд на любом фреймворке - по протоколу http.
    Ответ написан
    Комментировать
  • Как преобразовать json в структуру GO?

    @armantarkhanian
    Как-то так:
    package main
    
    import (
    	"encoding/json"
    	"fmt"
    	"log"
    )
    
    type item struct {
    	Branche branche `json:"branche"`
    }
    
    type branche struct {
    	BranchCount int    `json:"branch_count"`
    	ID          string `json:"id"`
    }
    
    func main() {
    	jsonString := `[
    		{
    			"branche": {
    				"branch_count": 5,
    				"id": "4504137598462702"
    			}
    		},
    		{
    			"branche": {
    				"branch_count": 6,
    				"id": "450413723846223"
    			}
    		}
    	]`
    
    	var items []item
    	if err := json.Unmarshal([]byte(jsonString), &items); err != nil {
    		log.Fatalln(err)
    	}
    
    	for _, item := range items {
    		fmt.Println(item.Branche.BranchCount, item.Branche.ID)
    	}
    }
    Ответ написан
    Комментировать
  • Как найти минимальный ограничивающий параллелепипед?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Я не уверен что стоит вообще искать идеальное решение. Особенно для 800 точек. Задача
    пахнет комбинаторной со всеми вытекающими.

    Я-бы предложил дать программе время (секунд) или количество итераций через которые
    она должна выдать почти-минимальный параллелепипед. Но мы при этом понимаем что это не самый идеальный.

    Для малого числа точек (8) можно построить выпуклую оболочку. И попробовать прикладывать
    первую грань параллелепипеда к каждой грани выпуклой оболочки. А оставшиеся грани мы можем
    получить вращением параллелепипеда до тех пор пока bounding volume не будет минимален.
    Учитывая дискретность выпуклой оболочки, поворот тоже может быть дискретным. Например там
    проверить штук 20 углов. Вот как-то так.
    Ответ написан
    2 комментария
  • В чем отличие ngnix от golang?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    На самом деле эта путаница по-человечески очень понятна и объяснима.
    Вы, как фронтендер, воспринимаете "веб-сервер" как такой черный ящик, "то место, откуда фронт запрашивает данные".

    В то время как этот термин может означать несколько разных понятий.
    1. Веб-сервер в вашем, широком понимании. Бэкенд целиком.
    2. Также веб-сервером может называться и сам компьютер, на котором все это крутится.
    3. В более узком смысле - это программа, которая принимает НТТР запросы. Вот это nginx и есть. Но сам по себе, без помощи других программ, он не может полностью представлять услуги веб-сервера. Например, в нем нет базы данных. Это, скорее, как правильно написали в соседнем ответе - такой прокси-сервер, который частично обрабатывает запросы сам (например к статическим файлам), а частично - проксирует запросы на другие программы.

    И вот на Го (или РНР, Питоне, JS, C#) как раз и пишется эта программа, которая, к примеру, обращается в БД, получает нужные данные и отдает их Nginx-у, который уже и возвращает их клиенту
    Ответ написан
    14 комментариев
  • В чем отличие ngnix от golang?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Ну раз с фронта пересели, то аналогию понять должны: В чëм отличие Google Chrome от JavaScript?
    Ответ написан
    3 комментария
  • Какой размер структуры в Go?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Это называется выравнивание памяти. На сколько именно выравнивается и чем именно - зависит от многих факторов. ОС, ЯП, процессор и прочее.
    Ответ написан
    Комментировать
  • Можно ли учить Go первым языком?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Да. Go - хороший язык. По крайней мере в нем есть типизация.
    Кроме того этот язык востребован на ниве devops и и микро-сервисов.
    Значит приток задач будет постоянно.
    Ответ написан
    Комментировать
  • Почему код в одном случае работает, а в другом - нет и выдает ошибку?

    @Wirusnyy-chel
    Канал done у вас в обоих случаях не буфферизированый - это значит что для выполнения операции записи в канал должны быть готовы и писатель (ch<-val) и читатель (<-ch).

    В первом варианте у вас писатель готов совершить операцию, но у него нет читателя и этот поток исполнения ставится на паузу, до тех пор, пока не появится читатель, а читатель определён в этом же потоке поэтому его никогда не будет. Программа зависнет и может упасть с ошибкой.
    Это можно поправить сделав канал буфферизированным
    done := make(chan book, 1)


    Второй случай работает, т.к. писатель и читатель в разных потоках и могут дождаться друг друга.
    Ответ написан
    Комментировать
  • Как ускорить поиск нескольких подстрок в строке в го?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Скорее всего, нужен "алгоритм Ахо-Корасик".
    Если его нет из коробки в Go, то можно запилить самостоятельно: ссылка, ссылка, ссылка
    Ответ написан
    2 комментария
  • Как запустить горутину навечно?

    2ord
    @2ord
    я думаю, что весь секрет в строке
    //Working with DB
    То есть утекает память из-за того самого кода, который нам не показан.
    С "вечной" горутиной пролем вроде как нет.
    Ответ написан
    Комментировать
  • Почему структура Golang работает не корректно при подключение в другом файле?

    includedlibrary
    @includedlibrary
    Потому что это приватное поле. Приватные поля начинаются с маленькой буквы, публичные - с большой. В рамках пакета вы можете обращаться к приватным полям структур этого пакета, но в других пакетах не можете этого делать
    Ответ написан
    Комментировать