检查Go字符串和字节片包含相同字节的最佳方法是什么?最简单的str == string(byteSlice)是效率低,因为它byteSlice首先复制.
我正在寻找一个版本的Equal(a,b [] byte),它以字符串作为参数,但找不到合适的东西.
考虑以下玩具示例.我想在Go中使用正则表达式匹配,其中名称是a由单个分隔的字母序列#,因此a#a#aaa是有效的,但是a#或a##a不是.我可以通过以下两种方式编写正则表达式:
r1 := regexp.MustCompile(`^a+(#a+)*$`)
r2 := regexp.MustCompile(`^(a+#)*a+$`)
Run Code Online (Sandbox Code Playgroud)
这两项都有效.现在考虑更复杂的匹配由单斜杠分隔的名称序列的任务.如上所述,我可以用两种方式编写代码:
^N+(/N+)*$
^(N+/)*N+$
Run Code Online (Sandbox Code Playgroud)
其中N是带有^和$ stripped的名称的正则表达式.由于我有两个N的情况,所以现在我可以有4个正则表达式:
^a+(#a+)*(/a+(#a+)*)*$
^(a+#)*a+(/a+(#a+)*)*$
^((a+#)*a+/)*a+(#a+)*$
^((a+#)*a+/)*(a+#)*a+$
Run Code Online (Sandbox Code Playgroud)
问题是为什么当匹配字符串时"aa#a#a/a#a/a"第一个失败而其余3个案例按预期工作?是什么导致第一个正则表达式不匹配?完整的代码是:
package main
import (
"fmt"
"regexp"
)
func main() {
str := "aa#a#a/a#a/a"
regs := []string {
`^a+(#a+)*(/a+(#a+)*)*$`,
`^(a+#)*a+(/a+(#a+)*)*$`,
`^((a+#)*a+/)*a+(#a+)*$`,
`^((a+#)*a+/)*(a+#)*a+$`,
}
for _, r := range(regs) {
fmt.Println(regexp.MustCompile(r).MatchString(str))
}
}
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是它打印 false true true true
PureScript中使用的类型系统的正确学术名称是什么?我正在寻找有关这方面的论文,并证明这是合理的.
特别是,当一个人想要抛出私有异常类型的实例并通过有效的计算将它传递给catch处理程序而不需要将类型公开给计算和可能性时,类型系统允许将异常解决为隐藏的通信通道问题为了抓住它,我们很高兴确认这是合理的.
是否有可以与 React 钩子一起使用的 forceUpdate 的替代品?
我的用例是组件实例之间的共享状态。本质上,每个实例只是单个全局状态的视图。使用 ES6 类,代码使用 componentDidMount 中的状态注册/取消注册组件,状态对其更改调用 forceUpdate,然后渲染方法直接查询全局状态。
我考虑将其切换为钩子。最初 useEffect 似乎完美地解决了这个问题。但后来我意识到我无法访问 forceUpdate。
我考虑了一种称为 useState 钩子的解决方法来添加一个虚拟计数器,然后从效果钩子更新计数器,但感觉就像一个黑客。我还可以将所有相关的共享状态参数复制到效果钩子中的组件状态中,然后从状态中引用这些参数。但它本质上是复制状态,因为当前我可以直接在渲染方法中使用这些行,因为它会使用复制状态的行来使代码膨胀。