Почему сборка go завершается успешно при ошибке разбора regexp.MustCompile?

Это не для go run или же go test (скомпилируйте и запустите), но не для go build (только компиляция). Я бы подумал MustCompile относится к компиляции, а не к времени выполнения.


package main

import (
    "regexp"
)

var someInvalidRegex = regexp.MustCompile(`(?!`)

func main() {
    someInvalidRegex.MatchString("foo")
}

Ошибка выполнения:

$ go run main.go
panic: regexp: Compile(`(?!`): error parsing regexp: invalid or unsupported Perl syntax: `(?!`

goroutine 1 [running]:
regexp.MustCompile(0x10b7d19, 0x3, 0xc420022070)
    /usr/local/Cellar/go/1.10.3/libexec/src/regexp/regexp.go:240 +0x171
exit status 2

Успешность компиляции:

$ go build -o foo
$ echo $?
0

Сбой во время выполнения снова:

$ ./foo
panic: regexp: Compile(`(?!`): error parsing regexp: invalid or unsupported Perl syntax: `(?!`

goroutine 1 [running]:
regexp.MustCompile(0x10b7d19, 0x3, 0xc420022070)
    /usr/local/Cellar/go/1.10.3/libexec/src/regexp/regexp.go:240 +0x171

1 ответ

Решение

Компилятор не анализирует ваше регулярное выражение. Это делается во время выполнения. Часть "Compile" имени функции "MustCompile" означает компиляцию регулярного выражения.

Другие вопросы по тегам