Golang задачи с собеседований
4.58K subscribers
489 photos
6 videos
12 files
256 links
Задачи, тесты и теоретические вопросы по Go. Так же по gin, grpc, горутинах, архитектуре api и http стэку.

Прислать задачу/вопрос в дар: @cyberJohnny
Сотрудничество: @cyberJohnny
加入频道
👨🏻‍💻 Как удалить повторяющиеся элементы в структуре Go


Есть структура

type Users struct {
Name string `json:"name"`
Surname string `json:"surname"`
}


В нее записаны элементы которые могут полностью повторяться и Name и Surname, то есть Иван Иванов и еще один Иван Иванов

Как удалить из структуры такие дубли?


Golang задачи с собеседований
👨🏻‍💻 Как работает интерфейс http.Handler

Начал разбираться с middlewares и появился вопрос.

package main

import (
"fmt"
"log"
"net/http"
)

func main() {
mux := http.NewServeMux()//здесь у mux нет явного метода
//ServeHTTP(ResponseWriter, *Request)
mux.HandleFunc("/test", test)
mdlwr := MdlWr(mux) //однако здесь не ругается что объект mux не реализует интерфейс.
http.ListenAndServe(":8181", mdlwr)
}
//функция принимает объект интерфейсного типа Handler
//и чтобы удовлетворить интерфейсу Handler, объект должен
//обладать методом `ServeHTTP(ResponseWriter, *Request)`
//но в main объект mux, который помещаю в Mdlwr
//не имеет такого метода явно. А как Mdlwr тогда работает?
func MdlWr(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Println(r.RequestURI)
h.ServeHTTP(w, r)
})
}
func test(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "ok")
}

Вопрос в комментах к коду Спасибо за ваше время, внимание и, в идеале, ответ.

Golang задачи с собеседований
👨🏻‍💻 Как долго будет расширяться буфер?

Это стандартный метод Write() в пакете bytes
// Write appends the contents of p to the buffer, growing the buffer as
// needed. The return value n is the length of p; err is always nil. If the
// buffer becomes too large, Write will panic with ErrTooLarge.
func (b *Buffer) Write(p []byte) (n int, err error) {
b.lastRead = opInvalid
m, ok := b.tryGrowByReslice(len(p))
if !ok {
m = b.grow(len(p))
}
return copy(b.buf[m:], p), nil
}


Правильно ли я понимаю, что данный метод будет расширять буфер и сам го не будет оповещать о раздутии буфера пока система не прекратит давать ресурс? А когда система прекратит давать ресурс, то программа просто запаникует и упадет? И какие есть "правильные" способы ограничить раздутие буфера, чтобы паники точно не было?


Golang задачи с собеседований
👨🏻‍💻 Golang: google wire: Как упростить поддержку кода?

Помогите пожалуйста разобраться с di google wire
wire.go

//go:build wireinject
// +build wireinject

package di

//go:generate wire ./...

import (
"github.com/3110Y/profile/internal/application/service"
"github.com/3110Y/profile/internal/application/validator"
"github.com/3110Y/profile/internal/infrastructure/database"
"github.com/3110Y/profile/internal/infrastructure/repository"
"github.com/3110Y/profile/internal/presentation/rpc"
"github.com/google/wire"
"github.com/jmoiron/sqlx"
)

type DI struct {
ProfileService *service.ProfileService
ProfileValidator *validator.ProfileValidator
ProfileRepository *repository.ProfileRepository
ProfileRPC *rpc.ProfileRPC
DB *sqlx.DB
}

func NewDI(
profileService *service.ProfileService,
profileValidator *validator.ProfileValidator,
profileRepository *repository.ProfileRepository,
profileRPC *rpc.ProfileRPC,
DB *sqlx.DB,
) *DI {
return &DI{
ProfileService: profileService,
ProfileValidator: profileValidator,
ProfileRepository: profileRepository,
ProfileRPC: profileRPC,
DB: DB,
}
}

func InitializeDI() (*DI, error) {
wire.Build(
NewDI,
wire.Bind(new(service.ProfileRepositoryInterface), new(*repository.ProfileRepository)),
wire.Bind(new(service.PasswordServiceInterface), new(*service.PasswordService)),
wire.Bind(new(rpc.ServiceProfileInterface), new(*service.ProfileService)),
service.NewPasswordService,
service.NewProfileService,
validator.NewProfileValidator,
repository.NewProfileRepository,
rpc.NewProfileRPC,
database.NewConnect,
)
return &DI{}, nil
}


Можно обойтись без struct Di?

Golang задачи с собеседований
👨🏻‍💻 Вопрос от пользователя

err_empty_response docker

Пишу веб-сервис на Golang. Хочу использовать Docker, но не получается.
app.go - главный файл

package main

import (
scraper_app "github.com/fentezi/scraper"
"github.com/fentezi/scraper/internal/handler"
"github.com/fentezi/scraper/pkg/logging"
)

func main() {
logger := logging.GetLogger()
logger.Info("Start server")
srv := new(scraper_app.Server)
logger.Info("Init handler")
hand := handler.NewHandler(logger)
if err := srv.Run("8080", hand.InitRouters()); err != nil {
logger.Fatal(err)
}
}


server.go - инициализация сервера

package scraper_app

import (
"net/http"
"time"
)

type Server struct {
httpServer *http.Server
}

func (s *Server) Run(port string, handler http.Handler) error {
s.httpServer = &http.Server{
Addr: "127.0.0.1:" + port,
Handler: handler,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
}
return s.httpServer.ListenAndServe()
}

Dockerfile

FROM golang:latest

WORKDIR /app

COPY go.mod go.sum ./

RUN go mod download

COPY . .

EXPOSE 8080

CMD ["go", "run", "./cmd/app.go"]

Контейнер создался без ошибок, всё нормально. Когда в браузере ввожу "http://localhost:8080", то получаю ошибку.

Страница недоступна. Сайт localhost не отправил данных. ERR_EMPTY_RESPONSE

Как это решить?

Golang задачи с собеседований
👨🏻‍💻 Вопрос от пользователя

Создание сегмента при его объявлении

Мне всегда казалось, что сегменты не создаются при их объявлении, наверное из-за книги по которой я начинал изучать гоу «Head First. Изучаем Go » 2020 ISBN 978-5-4461-1395-8(страница 210) вот строки оттуда (картинка)
Но наткнулся на то, что всё работает и так:

package main
import "fmt"

func main() {
var strArr []string
fmt.Print(strArr)
strArr = append(strArr,"qwerty")
fmt.Print(strArr)
}

результат:

[][qwerty]

...Program finished with exit code 0
Press ENTER to exit console

Получается, что у меня устаревшая информация и книга была старого издания, либо я в чём-то заблуждаюсь. Исходя из приведённою мною примера, при объявлении сегмента, он всё-таки создаётся автоматически, так ли это?

Golang задачи с собеседований
👨🏻‍💻 Вопрос от пользователя

rune и byte в чём разница?

Зачем придумали 2 отдельных типа данных и в чём их отличие и назначение?

Golang задачи с собеседований
👨🏻‍💻 Вопрос от пользователя

Ошибка подключения приложения к mysql / GO

Разрабатываю софт для парсинга баз данных mysql, столкнулся с ошибкой при использовании github.com/go-sql-driver/mysql. При запуске софта на Windows Server 2016 вылазит такая ошибка:

[mysql] 2024/02/19 05:28:57 packets.go:36: read tcp 127.0.0.1:52891->127.0.0.1:1433: wsarecv: An existing connection was forcibly closed by the remote host.
[mysql] 2024/02/19 05:30:57 packets.go:36: read tcp 127.0.0.1:52923->127.0.0.1:1433: wsarecv: An existing connection was forcibly closed by the remote host.
Error pinging database: driver: bad connection

В чем может быть проблема?

Golang задачи с собеседований
👨🏻‍💻 Вопрос от пользователя

Организация структуры проекта с несколькими модулями Golang

В 1 проекте будут содержаться 3 различные программы: Repeater, Controller и Executor, полагаю что необходимо под каждый выделить свой модуль. И я хочу сделать 1 модуль который они будут импортировать с некоторым набором общих для них функций. Пока что максиум что вышло в каждый модуль добавить копии файла с этими общими функциями, что выглядит не очень. Я часа 4 ковырялся в статьях и видео уроках но так и не смог из 1 несчастного модуля импортировать функции в другой неменее несчастный модуль. Прошу помощи как можно подробнее обьясните как сделать то что я хочу если это вообще возможно.


Golang задачи с собеседований
👨🏻‍💻 Вопрос от пользователя

Как в go сделать переменную с двумя типами и функцию вовращающую два типа

Как сделать так чтобы в переменной left можно было хранить как NumberNode так и BinaryOperationNode, и чтобы функция могла вовращать оба эти типа?

Код:

func (p *Parser) Term() BinaryOperationNode {
left := p.Factor() // Factor возвращает NumberNode

for p.CurrentToken.Type_ == token.Number {
operation := p.CurrentToken
right := p.Factor()
left := node.BinaryOperationNode{LeftOperand: left.Value, RightOperand: right.Value, Operation: operation.Value}

}

return left
}


Golang задачи с собеседований
👨🏻‍💻 Вопрос от пользователя

После ввода команды в терминал ничего не происходит

После ввода команды (go env -w GOINSECURE=«имя проекта») в терминал ничего не происходит, в чем может быть проблема ?

Golang задачи с собеседований
👨🏻‍💻 Вопрос от пользователя

Я новичок в вебе и хочу отправить данные из моего API в другой API, но мой API отправляет, а другой почему-то не получает

func main() {
r := gin.Default()

r.POST("/send-data", func(c *gin.Context) {

var token struct {
Api_key string `json:"accsestoken"`
}
var data struct {
Phone string `json:"phone"`
Amount float64 `json:"amount"`
}
if err := c.BindJSON(&data); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid JSON"})
return
}

token.Api_key = tools.Create_token(data.Phone, data.Amount)
local_id := uuid.New()

payload := map[string]interface{}{
"api_key": token.Api_key,
"phone": data.Phone,
"amount": data.Amount,
"local_id": local_id.String(),
}

res, err := json.Marshal(payload)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to prepare data"})
return
}

resp, err := http.Post("http://localhost:8000/api/trxs", "application/json", bytes.NewBuffer(res))
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to send data to target API"})
return
}
defer resp.Body.Close()

c.JSON(http.StatusOK, gin.H{"message": "Data sent successfully"})
})

r.Run(":3000")
}

Функция отправляющая данные:

r.POST("/api/trxs", func(c *gin.Context) {

var data struct {
Api_key string `json:"api_key"`
Phone string `json:"phone"`
Amount float64 `json:"amount"`
Local_id string `json:"local_id"`
}

if err := c.ShouldBindJSON(&data); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"unsuccess": false, "error": err.Error()})
return
}
fmt.Println(data)
// Возвращение данных клиенту
c.JSON(http.StatusOK, data)
})

r.Run(":8000")

эта функция получает данные, но выдает ошибку:

{
"error": "EOF",
"unsuccess": false
}

Когда я отправляю запрос из первой функции, я получаю:

{
"message": "Data sent successfully"
}

Но вторая функция выдаёт:

{
"error": "EOF",
"unsuccess": false
}


Golang задачи с собеседований
👨🏻‍💻 Вопрос от пользователя

Есть ли брокеры сообщений где можно сохранять объекты?

Прошу не пинать если вопрос глупый.

В пет-проекте понадобился брокер сообщений. Я пробовал натс но он работает только со строками.

А есть ли такие брокеры, которые умеют работать гибридно(pub/sub+p2p) и, главное, могут сохранять не только строки а ещё и объекты(структуры, мапы и т.д). P2P в приоритете, а гибрид необязательно но это задел на будущий функционал.

Да, знаю, что можно запаковать объект в json и сохранять как строку, но это накладные расходы на распаковку/запаковку каждой транзакции.

Да, работа ведётся с транзакциями, которые один пользователь запрашивает у другого. Может кто то считает что брокеры для этого не лучший вариант и знает вариант получше?

Golang задачи с собеседований