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

Прислать задачу/вопрос в дар: @cyberJohnny
Сотрудничество: @cyberJohnny
Download Telegram
Почему данная функция в GO при вводе в "1 1 1" не выдает ничего?

Почему данная функция в GO при вводе в "1 1 1" не выдает ничего?

package main

import (
"fmt"
"math"
)

func SqRoots() {
var a, b, c float64
fmt.Scan(&a, &b, &c)
D := math.Sqrt(b*b - 4*a*c)
if D < 0 {
fmt.Println("0 0")
}
if D == 0 {
fmt.Println((-b + D) / 2 * a)
}
if D > 0 {
fmt.Println((-b-D)/2*a, (-b+D)/2*a)
}
}
func main() {
SqRoots()
}

Golang задачи с собеседований
Ошибка "multiple-value in single-value context"

В коде:

fmt.Printf("Число фиббоначи для %v: %v", userNum, Fibbonachi(userNum, true))

Функция Fibbonachi получает 2 значения (1-е значение - число, второе способ расчета), и возвращает 2 значения (1-е значение - ответ, 2-е значение - ошибка или nil).

Получаю ошибку

multiple-value Fibbonachi(userNum, true) (value of type (int, error)) in single-value context

что логично, но как мне вывести через Printf только первое возвращаемое значение без ошибки?

Golang задачи с собеседований
Странная ошибка в GO

package main

import (
"fmt"
)

func main() {
var a int
fmt.Scanln(&a)
if a%2 == 0 && a < 0 {
fmt.Println("Число отрицательное и четное")
} else if a%2 == 1 && a < 0 {
fmt.Println("Число отрицательное и нечетное")
} else if a%2 == 0 && a >= 0 {
fmt.Println("Число положительное и четное")
} else if a%2 == 1 && a >= 0 {
fmt.Println("Число положительное и нечетное")
}
}

По какой-то причине последний if не работает, и на запрос -17 программа ничего не выводит.

Golang задачи с собеседований
Не работает url.Parse

Простой код:

_, err := url.Parse("555")
if err != nil {
panic(err)
}
Но не уходит на ошибку, почему?

Может я не правильно понимаю работу url.Parse - я думал что если передаваемое значение не url - то в err - должна быть какая-то ошибка...


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

При регистрации пользователя ему дается роль и в последующем их может становиться больше, то есть логика такая, что у одного пользователя может быть несколько ролей. При входе на сайт бэк делает запрос к бд, где вытаскивает все роли, а также id пользователя, после генерит токен и отсылает на клиента. В дальнейшем этот токен используется для получения доступа к эндпоинтам REST API. Была написана функция, в которой десириализую токен и забираю роли, в ручках потом просто проверяется, есть у этих ролей доступ к ручкам. Ниже приведен код того как генерится токен:

token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"user_id": existingUserID, // получаем запросом к бд
"roles": roles, // получаем запросом к бд
})
log.Printf("user_id: %v\n", existingUserID)
log.Printf("roles: %v\n", roles)
tokenString, err := token.SignedString([]byte(os.Getenv("SECRET_KEY")))
if err != nil {
c.JSON(500, gin.H{"message": "Failed to generate token", "error": err})
return
}

Далее код, того как десиаризую токен и пытаюсь вытащить роли из него:

package auth

import (
"errors"
"log"
"os"

"github.com/dgrijalva/jwt-go"
)

func CheckUserRole(tokenString string) ([]string, error) {

log.Printf("Received token: %s", tokenString)

token, err := jwt.Parse(tokenString, func(t *jwt.Token) (interface{}, error) {
return []byte(os.Getenv("SECRET_KEY")), nil
})
if err != nil || !token.Valid {
log.Printf("Error parsing token: %v", err)
return nil, errors.New("Invalid token")
}

claims, ok := token.Claims.(jwt.MapClaims)
if !ok {
log.Printf("Error getting claims from token")
return nil, errors.New("Invalid token claims")
}

roles, ok := claims["roles"].([]string)
if !ok {
log.Printf("Roles not found in token")
return nil, errors.New("Roles not found in token")
}

log.Printf("User roles: %v", roles)

return roles, nil
}

В общем проблема заключается в том, что не находит роли в токене: Roles not found in token. Почему не знаю, уже миллион отладочных выводов сделал, все роли правильно определяются. Вот вывод клэймов: Claims: map[roles:[22 18] user_id:9] скорее всего как-то неправильно пытаюсь их занести в roles, но вроде все правильно.

Golang задачи с собеседований
👨🏻‍💻 Реальный вопрос от реального человека

Как импортировать модуль в Go

Только начинаю изучать Go и столкнулся с такой проблемой: есть проект, который выглядит так

GoVersion
-go.mod
-client
--main.go
-network
--Network.go
--mod.go
-server
--main.go

В server/main.go и client/main.go пытаюсь импортировать Network, но все попытки выдают ошибки. Из того, что пробовал:

import (
"GoVersion/network"
"fmt"
"net"
)

package GoVersion/network is not in std

import (
"fmt"
"net"
"network"
)
package network is not in std

и несколько других вариантов с относительными путями

Подскажите пожалуйста, как можно починить импорты.

Golang задачи с собеседований
Пытаюсь сделать ручку на обновление таблицы. Как я могу сделать это эффективнее при помощи sqlx и gin?

type News struct {
ID string `json:"id"`
Title string `json:"title"`
Content string `json:"content"`
Categories string `json:"categories"`
}

var list = []News{}

func getNews(c *gin.Context) {
c.IndentedJSON(http.StatusOK, list)
}

func updateNews(c *gin.Context) {

dbType := os.Getenv("DB_TYPE")
dbName := os.Getenv("DB_NAME")
dbUser := os.Getenv("DB_USER")
dbPasswd := os.Getenv("DB_PASSWD")
dbHost := os.Getenv("DB_HOST")
dbPort := os.Getenv("DB_PORT")


db, err := sqlx.Open(dbType, dbUser+":"+dbPasswd+"@tcp("+dbHost+":"+dbPort+")/"+dbName)
if err != nil {
log.Fatal(err, "Ошибка открытия подключения.")
}
defer db.Close()

// Установка максимального количества открытых соединений в пуле
db.SetMaxOpenConns(10)

// Установка максимального количества соединений, которые могут быть одновременно использованы
db.SetMaxIdleConns(5)

// Проверка подключения к базе данных
err = db.Ping()
if err != nil {
log.Fatal(err, " Не удалось подключиться к базе.")
}

// Выполнение запросов к базе данных

rows, err := db.Query("SELECT news.Id, news.Title, news.Content, group_concat(newscategories.CategoryId separator ', ') as categories FROM news left join newscategories on news.Id=newscategories.NewsId group by news.Id;")
if err != nil {
log.Fatal(err)
//success := false
}
defer rows.Close()

// Обработка результатов запроса
for rows.Next() {
var id string
var title string
var content string
var categories string
err := rows.Scan(&id, &title, &content, &categories)
if err != nil {
log.Fatal(err)
}

nnews := News{ID: id, Title: title, Content: content, Categories: categories}
list = append(list, nnews)
fmt.Println(list)
}
if err = rows.Err(); err != nil {
log.Fatal(err)
}*/

id := c.Param("id")


for i, a := range list {
if a.ID == id {
c.BindJSON(&a)
list[i] = a
nid := c.Query(a.ID)
ntitle := c.Query(a.Title)
ncont := c.Query(a.Content)
ncatg := c.Query(a.Categories)

db, err := sqlx.Open(dbType, dbUser+":"+dbPasswd+"@tcp("+dbHost+":"+dbPort+")/"+dbName)
_, err = db.Exec("update news SET news.Id = ?, news.Title = ? , news.Content = ?, news.Categories = ? WHERE news.Id = ?;", nid, ntitle, ncont, ncatg, nid)
if err != nil {
log.Fatal(err)
}
c.IndentedJSON(http.StatusOK, a)
return
}
}
c.IndentedJSON(http.StatusNotFound, gin.H{"message": "news not found"})
}

Golang задачи с собеседований
Сервер gin возвращает 404 ошибку в браузере

Данный код не работает в браузере, но работает через curl.

package main

import (
"net/http"

"github.com/gin-gonic/gin"
)

type News struct {
ID string `json:"id"`
Title string `json:"title"`
}

var result = []News{{ID: "0", Title: "sdfsdfsdf"}}

func getAlbums(c *gin.Context) {
c.IndentedJSON(http.StatusOK, result)
}

func main() {
router := gin.Default()
router.GET("/result", getAlbums)

router.Run("localhost:8080")

}

Golang задачи с собеседований
Архитектура_встраиваемых_систем_VpKcKX.pdf
16.1 MB
📔 Title: Архитектура встраиваемых систем

#book #arch #RU

🌐 Lang.: Russian
🧔 Author: Лакамера Д.
🕘 Year: 2023
📑 Pages: 332
#️⃣ ISBN: 978-5-93700-206-8

📝 Description: В книге описываются принципы работы и взаимодействия различных компонентов в реальных системах. Представлен общий обзор процесса разработки встраиваемых систем; показано, как настроить среду разработки, рассматриваются
структура, механизмы загрузки и управление памятью встраиваемой системы. Вы изучите программный интерфейс и драйверы устройств, узнаете, как устанавливать связь через TCP/IP, как повысить безопасность устройств интернета вещей.
Наконец, вы на практике познакомитесь с многопоточными операционными системами, самостоятельно разработав планировщик, и научитесь использовать механизмы доверенного выполнения с аппаратной поддержкой.

@bzd_channel
Forwarded from Книжный клад | IT
📕Название: Security for Containers and Kubernetes: Learn how to implement robust security measures in containerized environments (2023)
Автор:
Luigi Aversa

Описание: В книге собраны различные решения, позволяющие командам agile проактивно отслеживать, защищать и противодействовать атакам, уязвимостям и неправильным конфигурациям на всех этапах процесса DevOps. Эти решения охватывают такие важные задачи, как проверка и защита капсул, контейнерных кластеров, времени выполнения контейнеров, политик авторизации, решение проблем безопасности контейнеров, обеспечение безопасного развертывания и миграции, а также укрепление рабочих процессов непрерывной интеграции и непрерывной доставки. Кроме того, книга поможет вам разработать надежную стратегию обеспечения безопасности контейнеров и даст рекомендации по проведению тестирования среды Kubernetes.

• Скачать книгу из архива

📚 Книжный клад | #RUS
👨🏻‍💻 Вывод присылаемых сообщений клиенту на консоли.

Сайт использует matrix и на вход нужно использовать логин, пароль и url сайта. Возникает ошибка client.Events и mautrix.EventTypeRoomMessage undefined. Вопрос можно ли как то сделать вывод сообщений в консоли go. Код ниже.

import (
"bufio"
"fmt"
"log"
"os"
"strings"

//"time"

mautrix "maunium net/go/mautrix"
//maevent "maunium net/go/mautrix/event"
//"github com/google/uuid"
)

func main() {
reader := bufio.NewReader(os.Stdin)

// Read the username
fmt.Print("Enter username: ")
username, _ := reader.ReadString('\n')
username = strings.TrimSpace(username)

// Read the password
fmt.Print("Enter password: ")
password, _ := reader.ReadString('\n')
password = strings.TrimSpace(password)

// Read the homeserver URL
fmt.Print("Enter homeserver URL: ")
homeserverURL, _ := reader.ReadString('\n')
homeserverURL = strings.TrimSpace(homeserverURL)

// Create a new client
client, err := mautrix.NewClient(homeserverURL, "", "")
if err != nil {
log.Fatal(err)
}

// Login
_, err = client.Login(&mautrix.ReqLogin{
Type: "m.login.password",
Identifier: mautrix.UserIdentifier{Type: "m.id.user", User: username},
Password: password,
Token: "",
DeviceID: "",
InitialDeviceDisplayName: "",
StoreCredentials: false,
StoreHomeserverURL: false,
})
if err != nil {
log.Fatal(err)
}

fmt.Println("Successful login!")

// Start message synchronization
err = client.Sync()
if err != nil {
log.Fatal(err)
}

// Handle incoming events
for event := range client.Events {
if event.Type() == mautrix.EventTypeRoomMessage {
// Process the incoming message
messageEvent := event.RoomMessage()

// Extract message details
sender := messageEvent.Sender
content := messageEvent.Content.Body

// Print the message to the console
fmt.Printf("New message from %s: %s\n", sender, content)
}
}



}


Golang задачи с собеседований
👨🏻‍💻 Как получить температуру CPU, GPU и т.д. на golang?


Были уже похожие вопросы, но конкретно про windows и к тому же без ответов или с неработающими ответами.

Я пробовал такой код:

package main

import (
"fmt"
"github.com/ssimunic/gosensors"
)

func main() {
sensors, err := gosensors.NewFromSystem()
// sensors, err := gosensors.NewFromFile("/path/to/log.txt")

if err != nil {
panic(err)
}

// Sensors implements Stringer interface,
// so code below will print out JSON
fmt.Println(sensors)

// Also valid
// fmt.Println("JSON:", sensors.JSON())

// Iterate over chips
for chip := range sensors.Chips {
// Iterate over entries
for key, value := range sensors.Chips[chip] {
// If CPU or GPU, print out
if key == "CPU" || key == "GPU" {
fmt.Println(key, value)
}
}
}
}

Но пакету gosensors нужен lm-sensors который очевидно на windows не поставить, а мне нужна кросс-платформенная программа.

Так как всё-таки получить температуру CPU и GPU на GoLang?

Golang задачи с собеседований
👨🏻‍💻 Проблемы с подключение статических файлов к 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 задачи с собеседований