Компания Максима-Телеком, проект 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 символ то заменяем на конкретый. Сказали, что хорошее решение.