func validCombinations(alphabet string, maxChar int) []string {
var result []string = []string{""}
var last, next int
for i := 1; i <= maxChar; i++ {
last = len(result)
for _, str := range result[next:] {
for _, char := range alphabet {
result = append(result, str+string(char))
}
}
next = last
}
return result
}
DB.SetMaxOpenConns
DB.SetMaxIdleConns
DB.SetConnMaxLifetime
db.BeginTx
для нее выбирается свободное соединение из пула.conn, err := Db.Conn(context)
conn.BeginTx
на этом соединении.user.conn.RemoteAddr().String()
conn
. Чтобы передать реальный ip пользователей его нужно вложить в заголовок запроса. Что нибудь вроде конфигурации nginxlocation / {
...
proxy_set_header X-Real-IP $remote_addr;
...
*http.Request.Header.Get("X-Real-IP")
[::1]:42120
, то как уже ответили - это просто нотация ipv6 type GuardedScanner struct{
s *Scanner
*sync.Mutex //Поскольку метод всегда пишет заморачиваться с RWMutex смысла не вижу
}
func (gs *GuardedScanner) addPath(path string) {
gs.Lock()
gs.s.addPath(path)
gs.Unlock()
}
//В первом методе можно обойтись sync/atomic
...
type stats struct{
...
extFreq map[string]*uint64
...
}
func (gs *GuardedScanner) incrExtCount(ext string) {
_, found := s.stats.extFreq[ext]
if found {
atomic.AddUint64(gs.stats.extFreq[ext], 1)
} else {
atomic.StoreUint64(gs.stats.extFreq[ext], 1)
}
}
func testFuncHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "===data test_server_msg===")
hj, ok := w.(http.Hijacker) //Проверка протокола на возможность Hijack
if !ok {
http.Error(w, "webserver doesn't support hijacking", http.StatusInternalServerError)
return
}
conn, _, err := hj.Hijack() //Вот здесь захват контроля
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
conn.Close()
}
for count := range resChan {
close(resChan)
, но у вас нет надежного места где закрыть. Поэтому переписать например такfor count := 0; count < len(list); count++ {
counter += <-resChan
}