Size: a a a

Golang Developers — русскоговорящее сообщество

2020 September 26

AK

Andrey Kolkov in Golang Developers — русскоговорящее сообщество
Wacker
а через param передавать не вариант совсем? Ибо такая конструкция, как у Вас... Совсем плохо смотрится.
думаю можно и так, просто смотрю на JS сервере там проходит... решил проверить.
источник

x

x-foby in Golang Developers — русскоговорящее сообщество
Andrey Kolkov
думаю можно и так, просто смотрю на JS сервере там проходит... решил проверить.
Конечно, проходит.
Валидный урл потому что.
Странный, не понятно что решающий, но валидный
источник

AK

Andrey Kolkov in Golang Developers — русскоговорящее сообщество
var DefaultServeMux = &defaultServeMux

var defaultServeMux ServeMux

// cleanPath returns the canonical path for p, eliminating . and .. elements.
func cleanPath(p string) string {
 if p == "" {
   return "/"
 }
 if p[0] != '/' {
   p = "/" + p
 }
 np := path.Clean(p)
 // path.Clean removes trailing slash except for root;
 // put the trailing slash back if necessary.
 if p[len(p)-1] == '/' && np != "/" {
   // Fast path for common case of p being the string we want:
   if len(p) == len(np)+1 && strings.HasPrefix(p, np) {
     np = p
   } else {
     np += "/"
   }
 }
 return np
}

Вот здесь он его чистит C:\Go\src\net\http\server.go
источник

AK

Andrey Kolkov in Golang Developers — русскоговорящее сообщество
// Clean returns the shortest path name equivalent to path
// by purely lexical processing. It applies the following rules
// iteratively until no further processing can be done:
//
//  1. Replace multiple slashes with a single slash.
//  2. Eliminate each . path name element (the current directory).
//  3. Eliminate each inner .. path name element (the parent directory)
//     along with the non-.. element that precedes it.
//  4. Eliminate .. elements that begin a rooted path:
//     that is, replace "/.." by "/" at the beginning of a path.
//
// The returned path ends in a slash only if it is the root "/".
//
// If the result of this process is an empty string, Clean
// returns the string ".".
//
// See also Rob Pike, ``Lexical File Names in Plan 9 or
// Getting Dot-Dot Right,''
// https://9p.io/sys/doc/lexnames.html
func Clean(path string) string {
 if path == "" {
   return "."
 }

 rooted := path[0] == '/'
 n := len(path)

 // Invariants:
 //  reading from path; r is index of next byte to process.
 //  writing to buf; w is index of next byte to write.
 //  dotdot is index in buf where .. must stop, either because
 //    it is the leading slash or it is a leading ../../.. prefix.
 out := lazybuf{s: path}
 r, dotdot := 0, 0
 if rooted {
   out.append('/')
   r, dotdot = 1, 1
 }

 for r < n {
   switch {
   case path[r] == '/':
     // empty path element
     r++
   case path[r] == '.' && (r+1 == n || path[r+1] == '/'):
     // . element
     r++
   case path[r] == '.' && path[r+1] == '.' && (r+2 == n || path[r+2] == '/'):
     // .. element: remove to last /
     r += 2
     switch {
     case out.w > dotdot:
       // can backtrack
       out.w--
       for out.w > dotdot && out.index(out.w) != '/' {
         out.w--
       }
     case !rooted:
       // cannot backtrack, but not rooted, so append .. element.
       if out.w > 0 {
         out.append('/')
       }
       out.append('.')
       out.append('.')
       dotdot = out.w
     }
   default:
     // real path element.
     // add slash if needed
     if rooted && out.w != 1 || !rooted && out.w != 0 {
       out.append('/')
     }
     // copy element
     for ; r < n && path[r] != '/'; r++ {
       out.append(path[r])
     }
   }
 }

 // Turn empty string into "."
 if out.w == 0 {
   return "."
 }

 return out.string()
}

ну хз, насколько это правильно...
источник

W

Wacker in Golang Developers — русскоговорящее сообщество
Andrey Kolkov
// Clean returns the shortest path name equivalent to path
// by purely lexical processing. It applies the following rules
// iteratively until no further processing can be done:
//
//  1. Replace multiple slashes with a single slash.
//  2. Eliminate each . path name element (the current directory).
//  3. Eliminate each inner .. path name element (the parent directory)
//     along with the non-.. element that precedes it.
//  4. Eliminate .. elements that begin a rooted path:
//     that is, replace "/.." by "/" at the beginning of a path.
//
// The returned path ends in a slash only if it is the root "/".
//
// If the result of this process is an empty string, Clean
// returns the string ".".
//
// See also Rob Pike, ``Lexical File Names in Plan 9 or
// Getting Dot-Dot Right,''
// https://9p.io/sys/doc/lexnames.html
func Clean(path string) string {
 if path == "" {
   return "."
 }

 rooted := path[0] == '/'
 n := len(path)

 // Invariants:
 //  reading from path; r is index of next byte to process.
 //  writing to buf; w is index of next byte to write.
 //  dotdot is index in buf where .. must stop, either because
 //    it is the leading slash or it is a leading ../../.. prefix.
 out := lazybuf{s: path}
 r, dotdot := 0, 0
 if rooted {
   out.append('/')
   r, dotdot = 1, 1
 }

 for r < n {
   switch {
   case path[r] == '/':
     // empty path element
     r++
   case path[r] == '.' && (r+1 == n || path[r+1] == '/'):
     // . element
     r++
   case path[r] == '.' && path[r+1] == '.' && (r+2 == n || path[r+2] == '/'):
     // .. element: remove to last /
     r += 2
     switch {
     case out.w > dotdot:
       // can backtrack
       out.w--
       for out.w > dotdot && out.index(out.w) != '/' {
         out.w--
       }
     case !rooted:
       // cannot backtrack, but not rooted, so append .. element.
       if out.w > 0 {
         out.append('/')
       }
       out.append('.')
       out.append('.')
       dotdot = out.w
     }
   default:
     // real path element.
     // add slash if needed
     if rooted && out.w != 1 || !rooted && out.w != 0 {
       out.append('/')
     }
     // copy element
     for ; r < n && path[r] != '/'; r++ {
       out.append(path[r])
     }
   }
 }

 // Turn empty string into "."
 if out.w == 0 {
   return "."
 }

 return out.string()
}

ну хз, насколько это правильно...
используйте ` для вставки кода в чат
источник

AK

Andrey Kolkov in Golang Developers — русскоговорящее сообщество
Wacker
используйте ` для вставки кода в чат
Я вроде так и использовал, правда 3 штуки "`"
источник
2020 September 27

Н

Николай in Golang Developers — русскоговорящее сообщество
Всем, привет, сервер паникует, как можно отловить, где именно?) Вроде везде сделал обработку ошибок
источник

VS

Vladimir Smagin in Golang Developers — русскоговорящее сообщество
что-то сломалось
источник

Н

Николай in Golang Developers — русскоговорящее сообщество
вот да))
источник

Н

Николай in Golang Developers — русскоговорящее сообщество
запаниковало после вот того, как я добавил доп запрос на упражнения
источник

x

x-foby in Golang Developers — русскоговорящее сообщество
Николай
Всем, привет, сервер паникует, как можно отловить, где именно?) Вроде везде сделал обработку ошибок
В панике же есть стектрейс — по нему должно быть понятно, что за функция.
Если хендлеры у вас анонимные функции, то можете деанонимизировать их, если это возможно)
Либо добавьте middleware с восстановлением из паники и добавляйте в контекст всю нужную инфу, которую после отлова паники залогируйте.

Ну или если вам известно какой это метод, то просто пройдитесь дебаггером.
источник

Н

Николай in Golang Developers — русскоговорящее сообщество
x-foby
В панике же есть стектрейс — по нему должно быть понятно, что за функция.
Если хендлеры у вас анонимные функции, то можете деанонимизировать их, если это возможно)
Либо добавьте middleware с восстановлением из паники и добавляйте в контекст всю нужную инфу, которую после отлова паники залогируйте.

Ну или если вам известно какой это метод, то просто пройдитесь дебаггером.
Спасибо, я, кажется, нашел, что паникует, пока не понял причину паники
источник

x

x-foby in Golang Developers — русскоговорящее сообщество
Николай
запаниковало после вот того, как я добавил доп запрос на упражнения
Начните закрывать rows и погуглите про join в запросах.
У вас тут прям беда какая-то в коде.
источник

Н

Николай in Golang Developers — русскоговорящее сообщество
x-foby
Начните закрывать rows и погуглите про join в запросах.
У вас тут прям беда какая-то в коде.
Начните закрывать rows - не понял
источник

x

x-foby in Golang Developers — русскоговорящее сообщество
Николай
Начните закрывать rows - не понял
источник

Н

Николай in Golang Developers — русскоговорящее сообщество
x-foby
Начните закрывать rows и погуглите про join в запросах.
У вас тут прям беда какая-то в коде.
погуглите про join в запросах - можно, в принципе, и просто JOIN использовтаь
источник

Н

Николай in Golang Developers — русскоговорящее сообщество
А есть смысл? row.Next() вернет false, если закончатся строки и она автоматом закроется
источник

x

x-foby in Golang Developers — русскоговорящее сообщество
Николай
погуглите про join в запросах - можно, в принципе, и просто JOIN использовтаь
Ну так начните использовать.
Вы на каждую строку, пришедшую из базы, формируете новый запрос и лезете в базу — это ужасно.

Ну и, кроме того, если вы уже так делаете, то хотя бы переменные заводите на уровне блока, а то сейчас у вас item.exs аккумулирует всё, что только можно.
источник

x

x-foby in Golang Developers — русскоговорящее сообщество
Николай
А есть смысл? row.Next() вернет false, если закончатся строки и она автоматом закроется
Нет
источник

Н

Николай in Golang Developers — русскоговорящее сообщество
x-foby
Ну так начните использовать.
Вы на каждую строку, пришедшую из базы, формируете новый запрос и лезете в базу — это ужасно.

Ну и, кроме того, если вы уже так делаете, то хотя бы переменные заводите на уровне блока, а то сейчас у вас item.exs аккумулирует всё, что только можно.
Вы на каждую строку, пришедшую из базы, формируете новый запрос и лезете в базу — это ужасно.

В моем случае у меня есть 2 таблицы, тренировки и упражнения, я не могу одним запросом вытащить из базы нужную структуру. По этому на каждую тренировку делаю запрос в бд за массивом упражнений
источник