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

Прислать задачу/вопрос в дар: @cyberJohnny
Сотрудничество: @cyberJohnny
加入频道
Как вывести 'некорректный вод' ,если ввод будет, допустим, -1 7 7?

package main

import "fmt"

func main() {
var a int
var b int
var c int
fmt.Scan(&a, &b, &c)
if a == c && a == b && c == b {
fmt.Println("Все числа равны")
} else if a != c && a != b && c != b {
fmt.Println("Все числа разные")
} else if a == c || a == b || b == c {
fmt.Println("Два числа равны")
} else {
fmt.Println("Некорректный ввод")
}
}

условия

Все числа равны, если все три числа равны.

Два числа равны, если любые два числа из трех равны.

Все числа разные, если все три введенных числа различаются.

Если во входных данных есть ошибка, например, введены отрицательные числа, то программа должна выводить сообщение Некорректный ввод.


Golang задачи с собеседований
panic: runtime error: index out of range [20] with length 14

package main

import "errors"

func GetCharacterAtPosition(str string, position int) (rune, error) {
if position < 0 || position >= len(str) {
return 0, errors.New("position out of range")
}
return []rune(str)[position], nil
}
Выдает ошибку:panic: runtime error: index out of range [20] with length 14 Как исправить?

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

Я пытаюсь решить задачу на интерфейсы в GO, но не понимаю что именно у меня не так

package main

import (
"fmt"
"math"
)

type Shape interface {
Area(radius float64) float64
Area(width float64, height float64) float64 #тут у меня ошибка дубликата функции, но я не понимаю как вызывать функции с помощью одинакового имени, если у них не будет одинакового имени в интерфейсе
}

func (s Circle) Area() float64 {
return math.Pi * s.radius * s.radius
}

func (s Rectangle) Area() float64 {
return s.width * s.height
}

type Rectangle struct {
width, height float64
}
type Circle struct {
radius float64
}

func main() {
figure_1 := Circle{radius: 1.0}
fmt.Println(figure_1.Area())
figure_2 := Rectangle{width: 57.2, height: 10.2}
fmt.Println(figure_2.Area())
}

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

На golang telebot v3. У треда есть свой chat id?

Golang задачи с собеседований
Почему данная функция в 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