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

Прислать задачу/вопрос в дар: @cyberJohnny
Сотрудничество: @cyberJohnny
加入频道
👨🏻‍💻 Вопрос от пользователя

Как получить доступ к полям интерфейсного типа если знаю, что там за структура?

Есть

type Mover interface {
Move()
}

type M struct {
Name string
Age int
}

func doMoving(mover Mover) {
mover.Move()
// Если я знаю, что у меня под mover-ом структура M
//то как я могу получить в этом месте доступ к полям Name и Age?
// Чтобы можно было как то так:
// fmt.Println(mover.Name)
}


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

Уведомлять пользователей telegram через определённый промежуток времени Golang

У меня есть телеграмм бот, который по взаимодействию с пользователем работает по типу "Запрос-ответ". Необходимой функцией этого бота является уведомлять пользователей в 9 утра о том, что нужно ввести новые данные с которыми он будет работать. Проблема заключается в том, что я не понимаю, как мне проверять текущее время периодически, поскольку код, который я использую для телеграмм бота, заканчивается входом в цикл for update := range updates , но внутри этого цикла, судя по логированию, я попадаю только, когда получаю сообщения от пользователя. Скорее всего я не до конца понимаю некоторых особенностей методов go-telegram-bot-api

func main() {
// используя токен создаем новый инстанс бота
bot, err := tgbotapi.NewBotAPI(telegramBotToken)
if err != nil {
log.Panic(err)
}
bot.Debug = true
log.Printf("Авторизация аккаунта бота %s", bot.Self.UserName)
// u - структура с конфигом для получения апдейтов
u := tgbotapi.NewUpdate(0)
u.Timeout = 1
// используя конфиг u создаем канал в который будут прилетать новые сообщения
updates := bot.GetUpdatesChan(u)
err = callAt(11, 17, 0, myfunc)
if err != nil {
fmt.Printf("error: %v\n", err)
}
//обработка сообщений
for update := range updates {
reply := "Не знаю что сказать"
msg := tgbotapi.NewMessage(update.Message.Chat.ID, reply)
msg.ReplyMarkup = board_StartCommand
if update.Message == nil {
continue
}
if _, err := bot.Send(msg); err != nil {
log.Panic(err)
}

}
}


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

spf13/viper не может прочитать файл

По аналогии с https://github.com/gogjango/gjango/blob/master/config/config.go

package config

import (
"fmt"
"log"
"os"
"path/filepath"
"read-clickhouse/tools"
"runtime"

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

func check() {
_, filePath, _, _ := runtime.Caller(0)
configName := "config.dev.yaml"
configPath := filePath[:len(filePath)-9] + "files" + string(filepath.Separator)

filename := fmt.Sprintf("%s%s", configPath, configName)

if _, err := os.Stat(filename); err == nil {
fmt.Println("Файл существует")
} else if os.IsNotExist(err) {
fmt.Println("Файл не существует")
} else {
fmt.Println("Ошибка при проверке файла:", err)
}
}

// Load returns Configuration struct
func Load(env string) *Configuration {
check()
_, filePath, _, _ := runtime.Caller(0)
configName := "config." + env + ".yaml"
configPath := filePath[:len(filePath)-9] + "files" + string(filepath.Separator)

tools.DebugPrintf(configName)
viper.SetConfigName(configName)
viper.AddConfigPath(configPath)

err := viper.ReadInConfig()
if err != nil {
log.Fatal(err)
}

var config Configuration
viper.Unmarshal(&config)
setGinMode(config.Server.Mode)

return &config
}

// Configuration holds data necessery for configuring application
type Configuration struct {
Server *Server `yaml:"server"`
}

// Server holds data necessary for server configuration
type Server struct {
Mode string `yaml:"mode"`
}

func setGinMode(mode string) {
switch mode {
case "release":
gin.SetMode(gin.ReleaseMode)
break
case "test":
gin.SetMode(gin.TestMode)
break
default:
gin.SetMode(gin.DebugMode)
}
}

вывод

go run main.go
Файл существует
[/home/des/proj/go-read-clickhouse/config/config.go:read-clickhouse/config.Load 38]
%!(EXTRA string=config.dev.yaml)

2024/02/02 16:34:51 Config File "config.dev.yaml" Not Found in "[/home/des/proj/go-read-clickhouse/config/files]"
exit status 1
make: *** [Makefile:2: run] Ошибка 1

сам файл в папке есть. ось - убунта. права 0775 накинул


Golang задачи с собеседований
What does the following program print?
Anonymous Quiz
39%
[7 0 5 6]
61%
[7 6 5]
What does the following program print?
Anonymous Quiz
40%
3 3
14%
3 4
7%
0 0
39%
0 1
What does the following program print?
Anonymous Quiz
42%
321
17%
21
40%
1
What does the following program print?
Anonymous Quiz
22%
012 789
31%
012 987
31%
222 999
16%
222 789