Задача. Как легче всего проверить срез на пустоту?
Создайте программу, проверяющую срез на пустоту. Найдите самое простое решение.
Код с решением будет завтра.
#задача
Создайте программу, проверяющую срез на пустоту. Найдите самое простое решение.
Код с решением будет завтра.
#задача
💩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
👍16
Задача. Реализуйте поведение min и max.
Реализуйте функции
Код с решением будет завтра.
#задача
Реализуйте функции
Min(x, y int)
и Max(x, y int)
, получающие два целых числа и возвращающих меньшее или большее значение соответственно.Код с решением будет завтра.
#задача
💩11🤔4🔥1
Ответ на «Реализуйте поведение min и max.»
По умолчанию Go поддерживает
По умолчанию 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
Часть 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 на основе личного опыта.
Хотите узнать, как писать конкурентный код, и как с его помощью решать бизнес-кейсы? Значит, вам сюда.
В ней Golang-разработчик в МТС Digital Артем Чаадаев собрал и подробно разобрал наиболее подходящие примеры использования конкурентного кода в Go на основе личного опыта.
Хотите узнать, как писать конкурентный код, и как с его помощью решать бизнес-кейсы? Значит, вам сюда.
Хабр
Конкурентность в 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
🔥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
🔥8👍2👎1🤯1