
Daniel
16.09.2016
10:49:41
за типами компайлер следит
а тут рантайм ошибка
вангую - мап объявален, но не создан

Vladislav
16.09.2016
10:50:26

Google

Daniel
16.09.2016
10:50:28

Мерлин
16.09.2016
10:51:58
func countlet(st string) map[string]Letters {
let := map[string]Letters{}
Lv:= ""
for _, v := range st {
if (int(v) <= 1103 && int(v) >= 1072) || int(v) == 1105 {
Lv = strings.ToLower(string(v))
let[Lv].Count = let[Lv].Count + 1
}
}
return let
}
Хотя бы так

Vladislav
16.09.2016
10:52:28
https://play.golang.org/p/FR1ZeGG9A9

Zver
16.09.2016
10:52:39

Daniel
16.09.2016
10:55:32
let[strings.ToLower(string(v))].Count++
вот тут let[strings.ToLower(string(v))] - nil

Vladislav
16.09.2016
10:58:18
все равно не понимаю

Мерлин
16.09.2016
10:59:28
все равно не понимаю
Когда ты создаёшь ассоциативный массив указателей, по умолчанию каждый указатель никуда не указывает и равен nil

Vladislav
16.09.2016
10:59:34

Daniel
16.09.2016
10:59:57
https://play.golang.org/p/KsuC7ezRYL

Zver
16.09.2016
11:00:58
https://play.golang.org/p/zvFJYI1GJP

Daniel
16.09.2016
11:01:44
мой вариант нагляднее :)

Мерлин
16.09.2016
11:01:58

Google

Zver
16.09.2016
11:02:11

Daniel
16.09.2016
11:02:23
но твой - эффективнее
в моем на один поиск по мапе больше

Vladislav
16.09.2016
11:02:46

Zver
16.09.2016
11:05:11

Vladislav
16.09.2016
11:05:55

Roman
16.09.2016
11:06:54

Zver
16.09.2016
11:07:50

Vladislav
16.09.2016
11:08:31
а, я понял, про какое множество вызовов идет речь
спасибо
а можно как-то красиво выводить эту мэпу со структурой или надо прогонять через цикл?

Zver
16.09.2016
11:19:38

Vladislav
16.09.2016
11:21:24
он же вроде нигде не используется...
ааа

Zver
16.09.2016
11:22:30
Он реализует интерфейс Stringer из fmt

Vladislav
16.09.2016
11:22:31
понял

Zver
16.09.2016
11:22:33
type Stringer interface {
String() string
}
Есть еще более продвинутое форматирование с помощью реализации Formatter, но в данном случае и реализации интерфейса Stringer хватает.

Vladislav
16.09.2016
11:27:07
понятно, спасибо

Google

Zver
16.09.2016
11:37:36
И вот еще если струтуру не по ссылке использовать. То еще покомпактней выйдет. Для больших структур так не стоит, а если мелкая, то еще быстрее должно быть, так как не надо выделять на них отдельно память.
https://play.golang.org/p/MaTkjqQVas

Oleh
16.09.2016
11:39:53

Zver
16.09.2016
11:42:10
На это каждую структурку выделяется память. В данном случае это конечно не критично. Но если таких записей миллион будет, то уже медленней будет и больше памяти съест.

Oleh
16.09.2016
11:42:34
если юзать ссылки, да?

Zver
16.09.2016
11:42:45
Да.
Но это имеет значение для небольших структур.

Vladislav
16.09.2016
11:43:47
не совсем понял с ссылками, если используем по ссылке, то выделяется память, если без - то не выделяется, правильно?

Oleh
16.09.2016
11:44:35
думаю на ссылку выделяется ещо память

Vladislav
16.09.2016
11:44:39
просто на мелких структурах все равно, на больших - необходимость, тогда почему отказываться?

Oleh
16.09.2016
11:45:07
если структура большая и копировать все затрантно

Плюшка
16.09.2016
11:45:15
кстати

Zver
16.09.2016
11:45:25
Тоже выделяется, но меньше и один раз. А по ссылке выделяется на хранение указателя и на структуру. Два выделения, а выделение памяти из кучи вещь медленная.

Плюшка
16.09.2016
11:45:51
на 64-бит на ссылку по идее уйдет еще столько же памяти, сколько на твою структуру
(64 бит указатель + 2 поля по 32 бит)

Oleh
16.09.2016
11:46:16
если структура маленькая

Zver
16.09.2016
11:47:26
Два тех же поля для процессора скопировать плевое дело. Еще быстре будет, чем по ссылке перейти.

Vladislav
16.09.2016
11:47:28
type Letters struct {
Count int
Rank int
}
type MapLet map[string]*Letters
но вот при таком раскладе только с ссылкой делать...

Zver
16.09.2016
11:48:14
Почему? Я же сделал без ссылки.
https://play.golang.org/p/MaTkjqQVas

Google

Vladislav
16.09.2016
11:50:20
да, я смотрю
увидел, что присвоение поменялосьъ

Nik
16.09.2016
11:55:51
а можно ли протаскивать в функции HttpHandelFunc username например
func authHandler(fn http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request, username string) {
userName := getUserName(r)
if userName != "" {
fn(w, r)
return
}
name := r.FormValue("name")
pass := r.FormValue("password")
if name == "" {
http.Redirect(w, r, "/login", 302)
return
}
if !check(name, pass) {
http.Redirect(w, r, "/login", 302)
return
}
setSession(name, w)
fn(w, r, name)
}
}
хочу например сделать так
и протащить юзернейм глубже

Zver
16.09.2016
12:08:32
Context использовать.

Nik
16.09.2016
12:10:28
это кто такой

Admin
ERROR: S client not available

Nik
16.09.2016
12:10:38
я пока придумал только пихать юзернейм в куку
и забирть оттуда
или это не секьюрно?

Zver
16.09.2016
12:12:43
Я не использовал. Но думаю, что именно контекст.
https://golang.org/pkg/net/http/#Request.Context
Сейчас еще ссылок накидаю.

Oleh
16.09.2016
12:13:13
мб в сесии можно указать
тоже хз

Zver
16.09.2016
12:13:35
https://golang.org/pkg/context/
https://blog.golang.org/context

Nik
16.09.2016
12:34:14

Google

Zver
16.09.2016
12:34:17
Вот такой набор использовать.
Возвращаясь к структурам и указателям.
BenchmarkStruct-4 10000 111969 ns/op
BenchmarkPointerToStruct-4 10000 143530 ns/op
Получается безуказательные структуры вышли чуть быстрей.

Vladislav
16.09.2016
12:51:54
но разница где-то процентов 20-25

Oleh
16.09.2016
12:52:36
кек, жаль память не замеряло)

Andrey
16.09.2016
12:55:39
по памяти понятно что копирование больше сьест, но вообще странно что по ссылке медленнее, интересно из-за чего так

Zver
16.09.2016
12:56:21
Да понятно.
И с копированием меньше сьест

Andrey
16.09.2016
13:00:24
func BenchmarkStruct(b *testing.B) {
let := make(map[string]*Letter)
это точно так должно быть?

Zver
16.09.2016
13:02:21
Да. Я мерил на коде, с которым человек выше разбирался.

Andrey
16.09.2016
13:03:00
я к тому что функция называется что там будет структура а там поинт на структуру и ниже функция с обратным называнием и обратной мапой

Zver
16.09.2016
13:04:04
Вод ведь напутал. ) Выходит наоборот.

Nik
16.09.2016
13:15:56
msisdn := "79260000361"
re, _ := regexp.Compile("[0-9]{11}")
fmt.Println(re.MatchString(msisdn))
если в msisdn вставить lol79260000000ew
то матч тоже отдает true
а как его огрнаичить на количество символов?

Vladislav
16.09.2016
13:25:55
начало и конец строки укажи в регулярке
re, _ := regexp.Compile("^[0-9]{11}$")