Как записать в консоль, прежде чем функция паникует? - PullRequest
1 голос
/ 30 апреля 2019

В C вы можете использовать функцию write() из библиотеки unistd.h. write() быстрее, чем printf(), и позволяет записывать в стандартный вывод (или файл) до того, как Segfault нарушит ваш код.

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

У меня есть следующий код (чтобы найти самое короткое слово в цепочке слов), который паникует, и я хочу выделить где, вставив методы записи.

func FindShort(s string) int {
  i := 0
  j := 0
  min := math.MaxInt32
  for true {
    for s[i] == ' ' {
      i++
      j++
    }
    for s[j] != ' ' && j < len(s) {
      j++
    }
    if j > i && (j - i) < min {
      min = j - i
    }
    i = j
    if j == len(s) {
      break
    }
  }
  return min
}

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Вы можете использовать заблокированную функцию, которая вызывает функцию восстановления, приведенная ниже функция приведет к «Восстановленной панике здесь»

defer func() {
    r := recover()
    if r != nil {
        fmt.Println("Recovered", r)
    }
}()

panic("panic here")
0 голосов
/ 30 апреля 2019

Ваш код проверяет все строки, содержит ли он пробел, но не проверяет, заканчивается ли строка (конец строки / конец файла / перевод строки). Существует более простой способ проверить, что является самым коротким словом:

package main

import (
    "fmt"
    "math"
    "strings"
)

func main() {
    min := math.MaxInt32
    shortest := math.MaxInt32
    s := strings.Split("this is a test", " ")
    for key, value := range s {
        if len(value) < min {
            min = len(value)
            shortest = key
        }
    }
    fmt.Print(s[shortest])
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...