Компания Максима-Телеком, проект Wi-Fi в метро Москвы/Питера. MT Free.

Общие вопросы

package main

import (
    "encoding/json"
    "fmt"
)

type MyData struct {
    One int    `json:"one"`
    Two string `json:"-"`
}

func testData1() {
    in := MyData{1, "two"}
    fmt.Printf("%#v\\n", in)  // &MyData{}
    encoded, _ := json.Marshal(in)
    fmt.Println(string(encoded))  // {"one": 1}
    var out MyData
    json.Unmarshal(encoded, &out)
    fmt.Printf("%#v\\n", out)  // что отобразится после вызова?
}

func testData2() {
    a := []int{1, 2, 3, 4}
    result := make([]*int, len(a))
    for i, v := range a {
        result[i] = &v
    }
    for _, u := range result {
        fmt.Printf("%d ", *u)  // что отобразится после вызова?
    }
}

Вопросы по slices (хитрые)

package main

import "fmt"

func testSlices1() {
    a := []string{"a", "b", "c"} // l:3 c:3
    b := a[1:2] // l:1 c:2
    b[0] = "q"
    fmt.Printf("%s\\n", a)  // aqc
}

func testSlices2() {
    a := []byte{'a', 'b', 'c'}
    b := append(a[1:2], 'd')
    b[0] = 'z'
    fmt.Printf("%s\\n", a)  // azd
}

func testSlices3() {
    a := []byte{'a', 'b', 'c'}
    b := append(a[1:2], 'd', 'x')
    b[0] = 'z'
    fmt.Printf("%s\\n", a)  // abc
}

func testSlices4() {
    a := []byte{'a', 'b', 'c'}
    b := string(a)
    a[0] = 'z'
    fmt.Printf("%s\\n", b)  // что отобразится после вызова?
}

Вопросы по Горутинам

package main

import (
    "fmt"
    "runtime"
    "time"
)

func testGoroutines1() {
    var ch chan int
    for i := 0; i < 3; i++ {
        go func(idx int) {
            ch <- (idx + 1) * 2
        }(i)
    }
    fmt.Println("result:", <-ch)
}

// что мы увидим в stdout?
func testGoroutines2() {
    ch := make(chan string)
    go func() {
        for m := range ch {
            fmt.Println("processed:", m)
        }
    }()
    ch <- "cmd.1"
    ch <- "cmd.2"
    close(ch)
}

func testGoroutines3() {
    data := []string{"one", "two", "three"}
    for _, v := range data {   
        go func() {
            fmt.Println(v)
        }() 
    }
    time.Sleep(3 * time.Second)
}

func testGoroutines4() {
    var num int
    for i := 0; i < 10000; i++ {
        go func(i int) {
            num = i
        }(i) 
    }
    fmt.Printf("NUM is %d", num)
}

func testGoroutines5() {
    dataMap := make(map[string]int)
    for i := 0; i < 10000; i++ {
        go func(d map[string]int, num int) {
            d[fmt.Sprintf("%d", num)] = num
            
        }(dataMap, i)
    }
    time.Sleep(5 * time.Second)
    fmt.Println(len(dataMap))
}

Вопросы по Defer - до них не дошли так как уже на рутинах и слайсах я поплыл

package main

import "fmt"

type toProcess struct {
    toReturn int
}

func (t *toProcess) process() {
    t.toReturn = 1
    fmt.Println(t.toReturn)
}

func (t *toProcess) testFunc() int {
    defer t.process()
    t.toReturn = 2
    return t.toReturn
}

func main() {
    var t = toProcess{}
    fmt.Println(t.testFunc()) // что отобразится после вызова?
}

Еще был вопрос по легкому алгоритму (на который я ответил):

У тебя есть строка, можешь ли ты изменить конкретное значение в этой строке - Мой ответ НЕТ, строка это не изменяемый массив байт. Что сделать если нам все таки нужно изменить какой-то элемент в строке - Мой ответ: создать новую строку, с уже измененным значением по конкретному индексу. Как ты это реализуешь, допустим тебе надо поменять не один символ, а скажем 4 и 5 символ? - Мой ответ: сделаю цикл for range преобразовав строку в слайс rune внутри условие if если 4 и 5 символ то заменяем на конкретый. Сказали, что хорошее решение.