Ответы пользователя по тегу Go
  • Где писать логику работы с БД?

    @12rbah
    Надо ли в структурах прописывать логику работу с базой данных или делать это в обработчиках?
    От проекта конечно зависит, но часто структуры в отдельном пакете models находятся поэтому логику пишут отдельно, если хочешь можно с интерфейсами сделать как в комменте написали
    Ответ написан
    Комментировать
  • Как в goшном SOA сервисе работать с базой данных?

    @12rbah
    Но это стало уже не очень удобным, потому что запросов много, и все их нада выносить в интерфейс.
    А точно это нужно? Просто если это интерфейс на 20+ методов, то в этом нет смысла, интерфейс нужен для кода, который может быть обобщенным, просто так выносить метод в интерфейс не имеет смысла.
    Сейчас дошло до того, что у меня отдельный интерфейс с базой, прокинут в каждый сервис, и для каждого сервиса с есть метод, вынесенный в интерфейс model
    В общем не используйте интерфейсы ради интерфейсов и не получите лишних проблем.
    Есть код среднего по размерам проекта, можете оценить как в нём писали код. еще код
    спойлер
    они не пихают всё в интерфейс

    В редких случаях такой подход имеет смысл, например когда пишут кроссплатформенную либу для GUI или у вас на беке будет гарантированно несколько баз с одинаковыми методами, если у вас ситуация не требует этого, то не пихайте всё в один интерфейс. Интерфейс создан для удобства а не для того чтобы мучаться.
    Ответ написан
  • Как правильно распарсить json?

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

    @12rbah
    Можно написать метод у структуры, который раз в час дергает сервис и в этот момент обновляет структуру, в момент обновления повесить мьютекс
    Ответ написан
    2 комментария
  • Какие книги по Go стоит прочесть новичку?

    @12rbah
    Начал с "Языка программирования Go" Кернигана. Хороший ли это выбор?
    Да. Только нужно делать упражнения, много полезного есть
    Ответ написан
    2 комментария
  • Как проверить наличие пользователя в БД?

    @12rbah
    В целом подход с двумя запросами избыточный в данном случае, можете просто делать вставку и возвращать ошибку. Кидать панику не нужно, нужно вынести код в отдельный метод и возвращать ошибку, если нужно то потом анализируйте её.
    Ответ написан
  • Кросс компиляция syscall?

    @12rbah
    В ряде случаев сисколы могут наверное быть совместимы, но конкретно в случае с сокетами под виндой и лунксом есть отличия как в их работе так и в программировании, но если вам это нужно то придется отдельную функцию писать.
    Ответ написан
  • Как организовать архитектуру кода для взаимодействия с БД в Golang?

    @12rbah
    паттерн Repository/Unit Of Work.
    Честно говоря это не очень популярно из-за того, что изолировать при помощи интерфейса не всегда нужно, часто структуры будет достаточно, в которой есть подключение к бд и поле для данных. Есть такой пример. Если у вас планируется несколько источников данных, то возможно вам будет удобнее делать на интерфейсах, но by design интерфейс обычно содержит 1-2 метода, а городить на каждую структуру интерфейс с 5-7 методами немного странное решение для го(с моей точки зрения), чтобы лучше понять го можно прочитать книгу кернигана и книгу 100 go mistakes(примерно так называется), чтобы получше понять суть языка.
    просто нет достойных ORMок для Golang
    Более приемлимым вариантов считается использование sql билдеров или генерация запросов, честно говоря к этому спорное отношение и где-то вполне себе используют орм.
    Ответ написан
    Комментировать
  • Golang как распарсить запрос с JSON и файлом?

    @12rbah
    Комментировать
  • Как правильно описать интерфейсом структуры?

    @12rbah
    может правильнее было бы сделать абстр фабрику
    Это и так не самый частый паттерн для применения, а в го тем более. Если хотите через интерфейсы делать, то фабрики хватит. Вообще хз зачем тут так извращаться, по факту в го проще разделить реализацию по пакетам и создавать нужный объект через NewProvider и затем уже делать с конкретной структурой всё что нужно.
    У разных банков, будут разные параметры метода Run, получается, я не могу описать структуры интерфейсом
    Напишите что вы хотите сделать, по ощущениям вы сову на глобус натягиваете.
    Есть структура с методом, который принимает на вход массив платежей и некий ключ, который определяет какой банк использовать.
    Если это то ссылки то фабрики тут хватит, вообще если вы не понимаете зачем вам нужны паттерны, то лучше не использовать их
    Ответ написан
    Комментировать
  • Нужно чтобы чан продолжил в цикле обследовать таблицу и проделывать код ниже, а он берёт лишь 5. Как грамотно составить цикл или настроить программу?

    @12rbah
    stCh := make(chan string)
        go staffs(stCh)
        shop_id := <-stCh
        v.Staffs = append(v.Staffs, Staff{
          Id:          <-stCh,
          Name:        <-stCh,
          Description: <-stCh,
          Price:       <-stCh,
        })
    
        m.Offerz = append(m.Offerz, Offers{v.Staffs})
    В целом довольно странно выглядит, так лучше не делать.
    Если у вас есть таблица в бд или файле, то просто считывайте строку целиком и сразу помещайте в структуру. А вообще лучше опишите подробнее, что вам нужно сделать. Т.к. по коду вообще непонятно, что вы хотите сделать,
    Ответ написан
    1 комментарий
  • Какие есть нормальные библиотеки для gui?

    @12rbah
    Можно глянуть тут, но в целом го это не про то как писать десктоп с малым весом.
    Пробовал fyne, но он какой-то ущербный, вес огромный после компиляции
    Честно говоря какая-то надуманная проблема, даже если вес 100-200 мб, по современным реалиям это по сути ничто.
    Я пару лет назад делал гуи на этом, штуки типа таблиц, деревьев, прогрессбаров, меню там есть, по сути обычный qt но на го, как по мне для 90% обычных проектов подойдет. Если хотите написать что-то типа ворда или ide, то найдите нормальный язык для gui, го не стоит для этого использовать.
    Ответ написан
    Комментировать
  • Как запустить на фоне программу?

    @12rbah
    Можно, просто запустить программу в бесконечном цикле
    Ответ написан
    Комментировать
  • Почему gomobile выдаёт эту ошибку и как её исправить?

    @12rbah
    Я попробовал в meta/platforms изменить версию min/max на 16

    Ну написано же прям " The system cannot find the path specified., unsupported API version 16" нужно установить хотя бы 19, и зачем одинаковые вопросы плодить?
    Ответ написан
  • Как протестировать метод с помощью testify?

    @12rbah
    Помогите разобраться и написать unit-тест для метода Worker
    А что именно, вы хотите протестировать, ну или какая цель у этих тестов? Писать тесты ради тестов обыно плохая идея, т.к. мало желания написать тест, нужно понимать зачем его писать. Для го есть хорошая книга тут, думаю для вашего случая достаточно.
    Ответ написан
    Комментировать
  • Как узнать какой базовый массив лежит в основе slice после использования метода append()?

    @12rbah
    Видел ваш предыдущий вопрос, но так и не понял, а зачем вам это нужно?
    тут 1
    тут 2
    Ответ написан
  • Как продолжить выполнение программы при возникновении ошибки?

    @12rbah
    if err != nil {
        log.Println("Error sending request to API endpoint.", err)
      }

    В вашем случае не нужен try catch, у вас проблема с тем, что при возникновении ошибки вы продолжаете выполнять код, а должны вернуться из тела функции и вернуть ошибку. Но если нужны механизмы типа try catch то гуглите panic/recover
    Ответ написан
    Комментировать
  • Не получается протестить handler используя *gin.Gonic?

    @12rbah
    Handler-ы находятся в другом пакете.
    Тестировать можно в том же пакете, но в целом это не важно, если только вы не делаете их приватными.

    И вот вопросом в том, требуется ли мне дополнительная функция, которая бы возвращала *gin.Engine, чтобы я мог в тестововм файле запускать спокойно сервер

    Нет не нужна. тут есть пример

    Для простых случаев получится примерно так
    func testHTTPResponse(t *testing.T, r *gin.Engine, req *http.Request, f func(w *httptest.ResponseRecorder) bool) {
    
    	w := httptest.NewRecorder()
    
    	r.ServeHTTP(w, req)
    
    	if !f(w) {
    		t.Fail()
    	}
    }
    
    func TestApiHandler(t *testing.T) {
    
    	var a apiService
    	router := gin.Default()
    	router.GET("/api/login",a.SignIn)
    	req, err := http.NewRequest("GET", "/test", nil)
    	if err != nil {
    		t.Fatal(err)
    	}
    	testHTTPResponse(t, router, req, func(w *httptest.ResponseRecorder) bool {
    		statusOK := w.Code == http.StatusOK
    
    		p, err := ioutil.ReadAll(w.Body)
    		pageOK := err == nil && strings.Index(string(p), "<title>Register</title>") > 0
    		return statusOK && pageOK
    	})
    
    }

    p.s. для случаев с аутентификацией/всякими токенами, тестировать будет труднее
    Ответ написан
    1 комментарий
  • Функция не принимает и не возвращает структуру?

    @12rbah
    Честно говоря не совсем понял почему в коде вы показываете что передаёте st []struct{} и возвращаете struct{}, нужно указывать конкретный тип данных. Вот рабочий код
    package main
    
    import (
    	"fmt"
    	"math/rand"
    	"time"
    )
    
    type WordsStruct struct {
    	Id    int
    	Fword string
    	Sword string
    	Freq  int
    }
    
    func Next(st []WordsStruct) WordsStruct {
    	rand.Seed(time.Now().Unix())
    	shw := st[rand.Intn(len(st))]
    	return shw
    }
    
    func main(){
    	st := []WordsStruct{
    		{Id: 1, Fword: "test", Sword:"est" , Freq:5 },
    		{Id: 2, Fword: "rest", Sword:"ww" , Freq:75 },
    	}
    	fmt.Println(Next(st))
    }
    Ответ написан
    1 комментарий