如何在功能崩溃之前写到控制台?

时间:2019-04-30 14:36:24

标签: go

在C语言中,您可以使用write()库中的函数unistd.hwrite()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 个答案:

答案 0 :(得分:1)

您可以使用延迟函数来调用恢复函数,下面的函数将导致“在此处恢复恐慌”

            <dependencies>
                <dependency>
                    <groupId>org.liquibase.ext</groupId>
                    <artifactId>liquibase-hibernate5</artifactId>
                    <version>3.6</version>
                    <exclusions>
                        <exclusion>
                            <groupId>org.hibernate</groupId>
                            <artifactId>hibernate-core</artifactId>
                        </exclusion>
                        <exclusion>
                            <groupId>org.hibernate</groupId>
                            <artifactId>hibernate-entitymanager</artifactId>
                        </exclusion>
                        <exclusion>
                            <groupId>org.hibernate</groupId>
                            <artifactId>hibernate-envers</artifactId>
                        </exclusion>
                        <exclusion>
                            <groupId>org.hibernate.javax.persistence</groupId>
                            <artifactId>hibernate-jpa-2.0-api</artifactId>
                        </exclusion>
                    </exclusions>
                </dependency>

答案 1 :(得分:0)

您的代码检查所有行是否包含空格,但不检查行是否结束(行尾/文件尾/换行)。有一种更简便的方法来检查最短单词是什么:

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])
}