Можно бесконечно читать руководства к языку, но лучше сразу тренироваться писать код. И мы как раз собрали подборку задач на Go для новичков.
24К открытий34К показов
Задачи по Go — отличный вариант для новичков, которые хотят прощупать все тонкости языка на практике.
Golang считают лёгким для изучения: простой синтаксис, нет классов и наследования. Другое преимущество Go — статическая типизация, благодаря которой ошибку можно определить ещё до запуска программы.
Изучаете язык и уже знаете всё это? Что ж, проверьте себя, решив несколько популярных задач по Go для начинающих.
Евгений Горбатов
Ведущий разработчик трайба «Автоматизация бизнес-процессов» МТС
Задача 1
Верните несколько значений функции.
Вариант решения
package main
import "fmt"
func main() {
var age, name = add(13, 14, "Иван", "Иванов")
fmt.Println(age) // 27
fmt.Println(name) // Иван Иванов
}
func add(x, y int, firstName, lastName string) (int , string) {
var z int = x + y
var fullName = firstName + " " + lastName
return z, fullName
}
Задача 2
Инициализируйте структуру.
Вариант решения
type Student struct {
Name string
Age int
}
var pa *Student // pa == nil
pa = new(Student) // pa == &Student{"", 0}
pa.Name = "Alex" // pa == &Student{"Alex", 0}
Задача 3
Отсортируйте элементы слайса целых чисел.
Вариант решения
func reverse(s []int) {
for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
s[i], s[j] = s[j], s[i]
}
}
func main() {
a := []int{1, 2, 3}
reverse(a)
fmt.Println(a)
// Output: [3 2 1]
}
Задача 4
Сравните слайсы.
Вариант решения
// Equal проверяет, что a и b содержат одинаковые элементы.
// nil аргумент эквивалентен пустому срезу.
func Equal(a, b []int) bool {
if len(a) != len(b) {
return false
}
for i, v := range a {
if v != b[i] {
return false
}
}
return true
}
Задача 5
Каков будет вывод этого кода?
package main
import "fmt"
const (
i = 8
j
k
)
func main() {
fmt.Println(i, j, k)
}
Ответ
888
Задача 6
Определите тип объекта.
Вариант решения
var x interface{} = []int{1, 2, 3}
xType := fmt.Sprintf("%T", x)
fmt.Println(xType) // "[]int"
Либо с помощью переключателя типов
var x interface{} = 2.3
switch v := x.(type) {
case int:
fmt.Println("int:", v)
case float64:
fmt.Println("float64:", v)
default:
fmt.Println("unknown")
}
// Вывод: float64: 2.3
Задача 7
Дано: два неупорядоченных среза. а) a := []int{37, 5, 1, 2} и b := []int{6, 2, 4, 37}. б) a = []int{1, 1, 1} и b = []int{1, 1, 1, 1}. Верните их пересечение.
Вариант решения
package main
import (
"fmt"
)
func intersection(a, b []int) []int {
counter := make(map[int]int)
var result []int
for _, elem := range a {
if _, ok := counter[elem]; !ok {
counter[elem] = 1
} else {
counter[elem] += 1
}
}
for _, elem := range b {
if count, ok := counter[elem]; ok && count > 0 {
counter[elem] -= 1
result = append(result, elem)
}
}
return result
}
func main() {
a := []int{37, 5, 1, 2}
b := []int{6, 2, 4, 37}
// [2, 37]
fmt.Printf("%v\n", intersection(a, b))
a = []int{1, 1, 1}
b = []int{1, 1, 1, 1}
// [1, 1, 1]
fmt.Printf("%v\n", intersection(a, b))
}
Задача 8
Напишите генератор случайных чисел.
Вариант решения
package main
import (
"fmt"
"math/rand"
"time"
)
func randNumsGenerator(n int) <-chan int {
r := rand.New(rand.NewSource(time.Now().UnixNano()))
out := make(chan int)
go func() {
for i := 0; i < n; i++ {
out <- r.Intn(n)
}
close(out)
}()
return out
}
func main() {
for num := range randNumsGenerator(10) {
fmt.Println(num)
}
}
Задача 9
Дано: строка a := “mfgah134517095aldrfgvh8h”. Вырежьте из строки всё, кроме чисел.
Вариант решения
a := "mfgah134517095aldrfgvh8h"
a = strings.TrimFunc(a, func(r rune) bool {
return !unicode.IsNumber(r)
})
// a = "1345170958"
Задача 10
Проверьте наличие ключа в map.
Вариант решения
brandsMap := map[string]string{
"ford": "ford",
"audi": "ford",
"lada": "nil",
}
_, value := brandsMap["lada"]
fmt.Print(value) // true,
//value выдаст true или false, если ключ lada есть в brandsMap
Задача 11
Дано: срезы a := []int{1, 2, 3} b := []int{4, 5, 6}. Выполните конкатенацию двух срезов.
Вариант решения
package main
import "fmt"
func main() {
a := []int{1, 2, 3}
b := []int{4, 5, 6}
c := append(a, b...)
fmt.Println(c)
}
package main
import (
"fmt"
"strconv"
)
func main() {
s := "123"
if i, err := strconv.Atoi(s); err == nil {
fmt.Printf("i=%d,type: %T\n", i, i) // i=123,type: int
}
if i, err := strconv.ParseInt(s, 10, 64); err == nil {
fmt.Printf("i=%d,type: %T\n", i, i) // i=123,type: int64
}
}
Задача 14
Проверьте, что файл существует.
Вариант решения
package main
import (
"errors"
"fmt"
"os"
)
func main() {
file, err := os.Open("data.json")
if errors.Is(err, os.ErrNotExist) {
fmt.Println("File not found")
return
}
// Выполните какое-нибудь действие с файлом
defer file.Close()
}
Задача 15
Создайте две горутины, чтобы числа из одного канала читались по мере поступления, возводились в квадрат и результат записывался во второй канал.
Вариант решения
package main
import (
"fmt"
)
func main() {
naturals := make(chan int)
squares := make(chan int)
go func() {
for x := 0; x <= 10; x++ {
naturals <- x
}
close(naturals)
}()
go func() {
for x := range naturals {
squares <- x * x
}
close(squares)
}()
for x := range squares {
fmt.Println(x)
}
}