Warning: Undefined array key 0 in /var/www/tgoop/function.php on line 65

Warning: Trying to access array offset on value of type null in /var/www/tgoop/function.php on line 65
141 - Telegram Web
Telegram Web
Задача. Как легче всего проверить срез на пустоту?

Создайте программу, проверяющую срез на пустоту. Найдите самое простое решение.

Код с решением будет завтра.

#задача
💩10👍1
Ответ на «Как легче всего проверить срез на пустоту?»

Легче всего проверить срез на пустоту с помощью встроенной функции len(), которая возвращает длину среза. Если len(slice) == 0, значит срез пуст.

Например:

package main
import "fmt"
func main() {
r := [3]int{1, 2, 3}
if len(r) == 0 {
fmt.Println("Empty!")
} else {
fmt.Println("Not Empty!")
}
}

#задача
😁20👍3👎3🤔1🤯1
Вопрос с собеседования. Что такое замыкания функций?

Ответ завтра.

#собеседование
Ответ на «Что такое замыкания функций?»

Замыкание функции — это значение функции, ссылающееся на переменные вне ее тела. Такая функция может обращаться к этим переменным и присваивать им значения.

Например, adder() возвращает замыкание, привязанное к собственной переменной sum, на которую оно ссылается.

package main
import "fmt"
func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}
func main() {
pos, neg := adder(), adder()
for i := 0; i < 10; i++ {
fmt.Println(
pos(i),
neg(-2*i),
)
}
}

#собеседование
👍17💩6🤔2
👍5🤔1
Какой будет результат выполнения кода?
Anonymous Quiz
43%
5
57%
15
👍16
Задача. Реализуйте поведение min и max.

Реализуйте функции Min(x, y int) и Max(x, y int), получающие два целых числа и возвращающих меньшее или большее значение соответственно.

Код с решением будет завтра.

#задача
💩11🤔4🔥1
Ответ на «Реализуйте поведение min и max.»

По умолчанию Go поддерживает min и max только для чисел с плавающей запятой, используя для этого math.min и math.max. Вам потребуется создать собственные реализации, чтобы то же самое можно было проделать для целых чисел.

package main
import "fmt"
// Min возвращает меньшее из x или y.
func Min(x, y int) int {
if x > y {
return y
}
return x
}
// Max возвращает большее из x или y.
func Max(x, y int) int {
if x < y {
return y
}
return x
}
func main() {
fmt.Println(Min(5,10))
fmt.Println(Max(5,10))
}

#задача
💩21👍5🔥2👏1
Разработка системы заметок с нуля

Часть 1
: проектирование микросервисной архитектуры
Мы спроектировали микросервисную архитектуру.

Часть 2: REST API для RESTful API Service + JWT + Swagger
Разработали RESTful API Service на Golang cо Swagger и авторизацией.

Часть 3: знакомство с Neo4j, работа над микросервисами CategoryService и APIService
Была посвящена знакомству с графовой БД Neo4j и работе над микросервисами CategoryService и APIService.

Часть 4: разработка микросервисов NoteService, TagService и UserService
Была посвящена разработке микросервисов.

Часть 5: знакомство с объектным хранилищем MinIO и разработка микросервиса на Golang

Golang Чат: @golang_talks
🔥15👍3💩1
Полезная статья на Хабр о Конкурентности Go

В ней Golang-разработчик в МТС Digital Артем Чаадаев собрал и подробно разобрал наиболее подходящие примеры использования конкурентного кода в Go на основе личного опыта.

Хотите узнать, как писать конкурентный код, и как с его помощью решать бизнес-кейсы? Значит, вам сюда.
👍9🔥5👏2👎1😁1
Задача. Отформатируйте строку без ее вывода

Найдите самый простой способ отформатировать строку с переменными, не выводя значение.

Код с решением будет завтра.

#задача
🤡8👍1🔥1
Ответ на «Отформатируйте строку без ее вывода»

Легче всего это сделать с помощью fmt.Sprintf(), которая возвращает строку, не выводя ее на экран.

Например:

package main

import "fmt"

func main() {
s := fmt.Sprintf("Size: %d MB.", 85)
fmt.Println(s)
}

#задача
🤮17👏12😁4👎2👍1
Задача. Сумма квадратов

Реализуйте функцию SumOfSquares, получающую целое число c и возвращающую сумму всех квадратов между 1 и c. Вам потребуется использовать инструкции select, горутины и каналы.

Например, ввод 5 приведет к возвращению 55, потому что $1² + 2² + 3² + 4² + 5² = 55$.

В качестве отправной точки можно взять этот код:

package main
import "fmt"
func SumOfSquares(c, quit chan int) {
// ваш код
}
func main() {
mychannel := make(chan int)
quitchannel:= make(chan int)
sum:= 0
go func() {
for i := 0; i < 6; i++ {
sum += <-mychannel
}
fmt.Println(sum)
}()
SumOfSquares(mychannel, quitchannel)
}

Код с решением будет завтра.

#задача
👎9🔥3👍1
Ответ на «Сумма квадратов»

package main
import "fmt"
func SumOfSquares(c, quit chan int) {
y := 1
for {
select {
case c <- (y*y):
y++
case <-quit:
return
}
}
}
func main() {
mychannel := make(chan int)
quitchannel:= make(chan int)
sum:= 0
go func() {
for i := 1; i <= 5; i++ {
sum += <-mychannel
}
fmt.Println(sum)
quitchannel <- 0
}()
SumOfSquares(mychannel, quitchannel)
}

Рассмотрим функцию SumOfSquares. Сначала на строке 4 мы объявляем переменную y, после чего переходим к циклу For-Select. В инструкциях select прописано два кейса.

case c <- (y*y): служит для отправки квадрата y по каналу c, который принимается в горутине, созданной в основной рутине.
case <-quit: служит для получения сообщения из основной рутины, которое вернется из функции.

#задача
👍7🔥3
🔥2
Какой будет результат выполнения кода?
Anonymous Quiz
33%
13.1
10%
13
57%
Ошибка компиляции
🔥5👍2
Задача. Merge sort

Реализуйте конкурентное решение merge sort (сортировка слиянием), используя горутины и каналы.

В качестве опорной точки можно взять эту последовательную реализацию:

package main
import "fmt"
func Merge(left, right [] int) [] int{
merged := make([] int, 0, len(left) + len(right))
for len(left) > 0 || len(right) > 0{
if len(left) == 0 {
return append(merged,right...)
}else if len(right) == 0 {
return append(merged,left...)
}else if left[0] < right[0] {
merged = append(merged, left[0])
left = left[1:]
}else{
merged = append(merged, right [0])
right = right[1:]
}
}
return merged
}
func MergeSort(data [] int) [] int {
if len(data) <= 1 {
return data
}
mid := len(data)/2
left := MergeSort(data[:mid])
right := MergeSort(data[mid:])
return Merge(left,right)
}
func main(){
data := [] int{9,4,3,6,1,2,10,5,7,8}
fmt.Printf("%v\n%v\n", data, MergeSort(data))
}

Код с решением будет завтра.

#задача
👍8🐳7
Ответ на «Merge sort»

package main
import "fmt"
func Merge(left, right [] int) [] int{
merged := make([] int, 0, len(left) + len(right))
for len(left) > 0 || len(right) > 0{
if len(left) == 0 {
return append(merged,right...)
}else if len(right) == 0 {
return append(merged,left...)
}else if left[0] < right[0] {
merged = append(merged, left[0])
left = left[1:]
}else{
merged = append(merged, right [0])
right = right[1:]
}
}
return merged
}
func MergeSort(data [] int) [] int {
if len(data) <= 1 {
return data
}
done := make(chan bool)
mid := len(data)/2
var left [] int
go func(){
left = MergeSort(data[:mid])
done <- true
}()
right := MergeSort(data[mid:])
<-done
return Merge(left,right)
}
func main(){
data := [] int{9,4,3,6,1,2,10,5,7,8}
fmt.Printf("%v\n%v\n", data, MergeSort(data))
}

В начале при сортировке слиянием мы рекурсивно разделяем массив на right и left стороны и на строках 30-34 вызываем MergeSort для обеих сторон.

Теперь нужно сделать так, чтобы Merge(left, right) выполнялась после получения возвращаемых значений от обоих рекурсивных вызовов, то есть и left и right должны обновляться до того, как Merge(left, right) сможет быть выполнена. Для этого на строке 26 мы вводим канал типа bool и отправляем в него true сразу после выполнения left = MergeSort(data[:mid] (строка 32).

Операция <-done блокирует код на строке 35 до инструкции Merge(left,right), чтобы она не продолжилась, пока горутина не завершится. После завершения горутины и получения true в канале done код переходит к инструкции Merge(left, right) на строке 36.

#задача
👍8❤‍🔥2🤯2🔥1
🔥4
Какой будет результат выполнения кода?
Anonymous Quiz
50%
nil
30%
not nil
20%
Ошибка компиляции
🔥8👍2👎1🤯1
2025/07/14 12:25:18
Back to Top
HTML Embed Code: