@proGO

Страница 219 из 1674
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
make везде же прописал...
Структуру не создаешь, или создать или не ссылкой делать.

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

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
да, спасибо, я как раз после фразы Мерлина стал думать, как это реализовать
Только вынести strings.ToLower(string(v)) вне обращения к мапу. Чтобы два(три) раза не вызывать.

Vladislav
16.09.2016
11:05:55
Только вынести strings.ToLower(string(v)) вне обращения к мапу. Чтобы два(три) раза не вызывать.
вот, этот момент я тоже увидел, но не понял, почему вынесли, разве там множество обращений, а не одно?

Roman
16.09.2016
11:06:54
это потому, что он ничего не делает
Ну почему же. Сисколлы и вот это всё.

Vladislav
16.09.2016
11:08:31
а, я понял, про какое множество вызовов идет речь

спасибо

а можно как-то красиво выводить эту мэпу со структурой или надо прогонять через цикл?

Vladislav
16.09.2016
11:21:24
https://play.golang.org/p/UgtsVH_INA
ого, спасибо, но я не совсем понял вот этот кусок: func (l *Letters) String() string { return fmt.Sprintf("%v", *l) }

он же вроде нигде не используется...

ааа

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

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

а можно ли протаскивать в функции HttpHandelFunc username например
ctx := context.WithValue(context.Background(), "user", "Petrov") req, err := http.NewRequest("GET", "http://example.com", nil) ... req = req.WithContext(ctx) ... user := req.Context().Value("user").(string)

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}$")

Страница 219 из 1674