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

Прислать задачу/вопрос в дар: @cyberJohnny
Сотрудничество: @cyberJohnny
加入频道
Пытаюсь сделать ручку на обновление таблицы. Как я могу сделать это эффективнее при помощи 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 задачи с собеседований
👨🏻‍💻 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 задачи с собеседований