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

Прислать задачу/вопрос в дар: @cyberJohnny
Сотрудничество: @cyberJohnny
Download Telegram
👨🏻‍💻 Проблемы с подключение статических файлов к HTML с gorilla/mix Go

В HTML я подключил css:

<link rel="stylesheet" href="../static/css/reset.css">
<link rel="stylesheet" href="../static/css/style.css">


Вот код в main.go:

import (
"html/template"
"log"
"net/http"

"github.com/gorilla/mux"
)

var templates *template.Template

func main() {
templates = template.Must(template.ParseGlob("ui/html/*.html"))

log.Println("Server will start at http://localhost:8080/")

r := mux.NewRouter()
r.HandleFunc("/", home).Methods("GET")
r.HandleFunc("/forum", forum).Methods("GET")
r.HandleFunc("/adviсe", adviсe).Methods("GET")
http.ListenAndServe(":8080", r)

fs := http.FileServer(http.Dir("./ui/static/"))
r.PathPrefix("/static/").Handler(http.StripPrefix("/static/", fs))

log.Fatal(http.ListenAndServe(":8080", r))

}
И код в handlers.go:

func home(w http.ResponseWriter, r *http.Request) {
templates.ExecuteTemplate(w, "home_page.html", r)
}

func forum(w http.ResponseWriter, r *http.Request) {
templates.ExecuteTemplate(w, "forum.html", r)
}

func adviсe(w http.ResponseWriter, r *http.Request) {
templates.ExecuteTemplate(w, "adviсe.html", r)
}


Сервер не видит css

Golang задачи с собеседований
👨🏻‍💻 golang: sqlx: в одном случае нужен db:"user_id" в другом db:"userId"

Есть такой код:

type UserToRoleToCRM struct {
Id string
UserId string `db:"user_id"`
CRMId string `db:"crm_id"`
RoleId string `db:"role_id"`
}

func TestField(t *testing.T) {
ctx := context.Background()
con := fmt.Sprintf(
"host=%s user=%s password=%s dbname=%s port=%s sslmode=disable TimeZone=Europe/Moscow",
os.Getenv("POSTGRES_HOST"),
os.Getenv("POSTGRES_USER"),
os.Getenv("POSTGRES_PASSWORD"),
os.Getenv("POSTGRES_DB"),
os.Getenv("POSTGRES_PORT_EXTERNAL"))
connect, _ := sqlx.Connect("pgx", con)
defer database.Clean(t, "user_to_role_to_crm", connect)

e := entity.UserToRoleToCRM{
Id: uuid.New().String(),
UserId: uuid.New().String(),
CRMId: uuid.New().String(),
RoleId: uuid.New().String(),
}
dsn := "INSERT INTO user_to_role_to_crm (id, user_id, crm_id, role_id) VALUES (:id, :userId, :crmId, :roleId)"
_, err := connect.NamedExecContext(ctx, dsn, &e)
assert.Nil(t, err)
eT := entity.UserToRoleToCRM{}
err = connect.GetContext(ctx, &eT, "SELECT * FROM user_to_role_to_crm WHERE id = $1", e.Id)
assert.Nil(t, err)
}


Если я пишу db:"user_id" выдает ошибку

Error:          Expected nil, but got: &errors.errorString{s:"could not find name userId in &entity.UserToRoleToCRM{Id:\"a0caf511-193a-4b51-8b12-4b63ba64aaa7\", UserId:\"645fb689-1994-4387-a04c-605bdc69d01d\", CRMId:\"f32f27af-ed96-4ade-950a-cfa49ce84701\", RoleId:\"7929bad0-1aaa-42f1-88fe-dabfc55792b4\", CreateAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), UpdateAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC)}"}


в строке _, err := connect.NamedExecContext(ctx, dsn, &e)

Если я пишу db:"userId" выдает ошибку

Error:          Expected nil, but got: &errors.errorString{s:"missing destination name user_id in *entity.UserToRoleToCRM"}


в строке err = connect.GetContext(ctx, &eT, "SELECT * FROM user_to_role_to_crm WHERE id = $1", e.Id)

Как правильно настроить нейминг стратегию sqlx?

Golang задачи с собеседований
👨🏻‍💻 Golang. Получить температуры видеокарты, процессора и HDD в windows

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

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

Помогите написать регулярное выражение (golang)


надо на go найти, получить и потом заменить в тексте слова, заключенные в определенные символы (заменить вместе с этими символами). Пример строки: str := "text some text ${example_text}"

Найти надо подстроку, заключенную в ${ }. И потом эту подстроку вместе с окружающими символами заменить.

Пока мне удалось только определить, что строка содержит комбинацию

m, _ := regexp.MatchString(^\$\{.*\}$, valueField.(string)).

Дальше пока ступор, подскажите, пожалуйста, как действовать.

Golang задачи с собеседований
👨🏻‍💻 Добавление одного массива в конец другого

Задача: Добавть один массив в другой

Как я хотел бы: Без использования циклов и рекурсии. Типы именно такие какие указаны в коде(a :=[10]int{}, b:= []int{})

Как я могу: К сожалению тольк так и то же самое но циклом:

package main

import "fmt"

func main() {
a := [10]int{}
b := []int{4, 5, 1, 8}
i := len(a)
j := len(b)
fmt.Println(appendBtoA(a, b, i, j))
//out: [0 0 0 0 0 0 4 5 1 8]
}

func appendBtoA(a [10]int, b []int, i, j int) [10]int {
i -= 1
j -= 1
if j >= 0 {
a[i] = b[j]
return appendBtoA(a, b, i, j)
}
return a
}


Но мне бы хотелось сделать через дополнительный срез указывающий на a и без использования циклов и рекурсий.

по логике:

// естественно не рабочий вариант. но нужно приблизительно так.
func appendBtoA2(a, b []int) []int {
c := a[len(a)-len(b):] //здесь `c` если правильно понимаю, указывает на `a`
c = b //здесь `c`, вроде как указывает на `b`.
//потому начальный массив не меняется.
//но это все не точно а лишь мое дилетантское предположение
return a
}


За основу желаемого решения взял механизм:

package main

import "fmt"

func main(){
a := [10]int{5, 4, 6, 7, 8, 2, 4, 5, 8, 5}
b := a[4:6]
b[0] = 0
b[1] = 0
fmt.Println(a) //out: [5 4 6 7 0 0 4 5 8 5]
}



Golang задачи с собеседований
👨🏻‍💻 Подключение CSS к HTML с Go linux

Проблемы с подключением css к проекту. В HTML у меня:

<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>

<!-- Стили сайта -->
<link rel="stylesheet" type="text/css" href="styles.css">
</head>
<body>
<div class="container">
<img class="imgstars" src="https://thumb.tildacdn.com/tild3531-3462-4931-b561-653663313033/-/format/webp/image.png">
<h1 class="h1">Hello</h1>
<h1 class="h1">Hi</h1>
</div>
</body>
</html>


А CSS:

body {
background-color: blue;
}

.container {
width: 100%;
}

h1 {
color: green;
}


Код на Go:
import (
"html/template"
"net/http"
)

var tpl *template.Template

func home_page(w http.ResponseWriter, r *http.Request) {
tpl.Execute(w, nil)
}

func handleRequest() {
http.HandleFunc("/", home_page)
http.ListenAndServe(":8080", nil)
}

func main() {
tpl, _ = tpl.ParseFiles("index.html")
handleRequest()
}


Не меняется ни текст ни фон.

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

👨🏻‍💻 Страница веб-приложения на Go: заменить Javascript на Go во фронтенде


Интересует один вопрос (возможно глупый).

Можно ли при создании фронта веб-приложения заменить JS в графических элементах(всплывающие окна, вложенные списки, и т.д.) на методы из Go?

P.S.: прошу палками не бить и помидорами не закидывать))


Golang задачи с собеседований
Как вычислить сложность моего алгоритма?

Продолжаю разбираться с рекурсией

Задача: определить является ли N простым числом.

Условие: использовать только рекурсию.

Мое решение(в комментах пояснение моей логики):

package main

func main() {
rec(890, 1, 0) //Output: NO
println()
}

// функция имеет допущение, что n>1(т.е рассчитывает на здравый смысл вызывающего)
// для n<=1 результат будет неправильным(YES).
func rec(n, d, c int) {
// если делитель дошел до делимого,
//то очевидно, что если они равны то делятся без остатка и
//делимость проверять не нужно. Просто выходим из функции.
//этот случай означает, что от d>1 до n делителей не найдено.
//значит n делится только на себя и на 1
if d > n {
print("YES")
return
}
//поиск делителя для n в диапазоне от 2 до n
if n%d == 0 && d > 1 {
//увеличиваем счетчик делителей
c++
//если d еще не дошел до n, а уже нашел делитель(c>0),
//то число точно составное, дальнейшие проверки не имеют смысла
//говорим что число составное и выходим из функции.
if c > 1 || (n%2 == 0 && n > 2) {
print("NO")
return
}
n=int(math.Sqrt(float64(n))) //так код продолжает работать, но делает это быстрее,
//хоть и нет гарантии что правильно рассчитывает. Но пока что ни разу не ошибся
}
//рекурсивно проверяем является ли d+1 делителем n
//рекурсивный вызов будет происходит до тех пор,
//пока c<1 || (d<n && n%d!=0 && (n>2 && n%2!=0))
rec(n, d+1, c)
}


Вопрос1: Можно ли обойтись без такого количества if(насколько сильно намудрил)?

Вопрос2: Как рассчитать сложность этого алгоритма? Как сделать его не линейным

Вопрос3: На слишком больших числах, например 1284762193641112317 получаю stack overflow. в чем проблема? Мое предположение - слишком много рекурсивных вызовов. Но как это исправить?

UPD:

Добавил в код фрагмент

n = int(math.Sqrt(float64(n)))
И код продолжает работать. Придумал такое, в поисках способа сократить количество рекурсивных вызовов, а с таким фрагментом, в каждом вызове n уменьшается до своего корня.

Golang задачи с собеседований
👨🏻‍💻 Как удалить повторяющиеся элементы в структуре 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 задачи с собеседований