我从Ruby来,现在正在看围棋。我开始编写一些代码来检查对给定主机的TLS支持。
var tls_versions = map[uint16]string{ tls.VersionSSL30: "SSLv3", tls.VersionTLS10: "TLSv1.0", tls.VersionTLS11: "TLSv1.1", tls.VersionTLS12: "TLSv1.2", } var refused_re = regexp.MustCompile(": connection refused") var nodns_re = regexp.MustCompile(": no such host") var versionnotsupported_re = regexp.MustCompile(": protocol version not supported") func checkversion(host string) (map[string]bool, error) { // {{ ret := map[string]bool{} for version := tls.VersionSSL30; version <= tls.VersionTLS12; version++ { conn, err := tls.Dial("tcp", host+":443", &tls.Config{ MinVersion: uint16(version), }) if err != nil && (refused_re.MatchString(err.Error()) == true || nodns_re.MatchString(err.Error()) == true) { log.Println(err) return ret, err } if err != nil && versionnotsupported_re.MatchString(err.Error()) == true { ret[tls_versions[uint16(version)]] = false log.Println("Not supported: "+host+" "+tls_versions[uint16(version)]) } ret[tls_versions[uint16(version)]] = true if conn != nil { conn.Close() } } return ret, nil }
在GO中有可能进行良好的错误管理。
请参阅Dave C的这个答案,以获得一个很好的总结和很好的例子。
不幸的是,对于TLS
包,您就不走运了。您试图检测的错误是由fmt.errorf()
调用(这些调用委托给errors.new()
)生成的,因此它们在任何方面都不是特殊的,也不是预先声明的,因此在区分它们方面,您不能比当前的解决方案做得更好。可能是开发人员懒得提供更复杂或更容易跟踪的错误,或者只是他们认为这并不重要,为了简单而忽略了这一点;因此,它们目前更像是为开发人员提供信息。
进一步阅读(引自戴夫C的回答):
如果问题模棱两可,请道歉。
问题内容: 创建用于通过API获取数据的数据库管理器API的基本概念。我正在使用GORM来获取strcut实例的数据。因此,代表表的结构为300-400。 下一步,我实现了一个函数,该函数通过表名(通过API端点参数获取的内容)返回结构的正确实例。 之后是一个操作结构,其中唯一的一个字段是DB。有一些方法,例如我要使用GORM db.Last(&users)函数的GetLast()。 有几点,所以
我正试图让所有表都显示在Adminer中,这样我就不必远程访问Windows服务器来查看表并从我正在使用的MS SQL DB进行查询。当我点击“选择表名”查看任何表上的数据时,我遇到了这个错误。你认为我需要做什么来解决这个问题? ! ) 警告:mssql_query():消息:无法使用DB Library(如ISQL)或ODBC 3.7版或更早版本将仅Unicode排序规则或ntext数据中的Un
问题内容: 在Golang中,我们可以将GitHub上的开源库指定为依赖项。例如: 如果我理解正确,这将尝试根据您的Go版本查找分支,默认为master。 因此,无法导入依赖的特定版本,例如: 那么,在Go中管理依赖项的最佳实践是什么? 我可以看到两种方法。 I.版本模块 是否为具有重大变更的主要版本创建新模块? 例如,我的Go库可以定义模块v1和v2,因此您可以执行以下操作: 要么: 根据您的需
我正在使用Spring Batch Admin从我的主项目的批处理模块中启动批处理。 在Spring batch Admin项目的依赖项中,将批处理模块编译为JAR addedstrong文本,如下所示: 因为我在一个reader类上添加了“@stepscope”,所以在部署Spring Batch Admin时,我会遇到以下错误 但是我没有找到如何使用类似的声明来防止Spring Batch A
上述实现并发的代码中为了保持主线程不挂掉,我们都会在最后写上一个死循环或者写上一个定时器来实现等待 goroutine 执行完毕 上述实现并发的代码中为了解决生产者消费者资源同步问题,我们利用加锁来解决,但是这仅仅是一对一的情况,如果是一对多或者多对多,上述代码还是会出现问题 综上所述,企业开发中需要一种更牛 X 的技术来解决上述问题,那就是管道(Channel) Channel 的本质是一个队列