Разделение класса Thread из реализации Runnable также позволяет избежать возможных проблем синхронизации между потоком и методом run (). Отдельный Runnable обычно дает большую гибкость в том, как ссылающийся и исполняемый код ссылается и выполняется.
Я обнаружил, что строка ошибки будет соответствовать типу ошибки, но я не уверен (вообще), это работает на разных платформах или даже в разных локалях.
if err, ok := err.(*os.PathError); ok {
//EINVAL
if err.Err.Error() == "invalid argument" {
…
// - OR -
//ENOENT
if err.Err.Error() == "no such file or directory" {
…
}