Виммельбух, 3, перетяжка
Виммельбух, 3, перетяжка
Виммельбух, 3, перетяжка

15 задач по Golang для начинающих

Логотип компании МТС
Отредактировано

Можно бесконечно читать руководства к языку, но лучше сразу тренироваться писать код. И мы как раз собрали подборку задач на Go для новичков.

25К открытий36К показов

Задачи по 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)

}
		

Задача 12

Отложите вызов функции с возвращаемым значением.

Вариант решения
			func main() {
    defer fmt.Println("World")
    fmt.Println("Hello")
}
		

Задача 13

Преобразуйте строку в число.

Вариант решения
			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)
	}
}
		
Следите за новыми постами
Следите за новыми постами по любимым темам
25К открытий36К показов