ChatGPT初体验
先看我与ChatGPT的聊天记录
再说说我的疑惑
bytes.Equal(a, b []byte) bool
函数的内部实现是将两个字节强转成字符串后再用==
运算符比较的,它竟然不知道!- ChatGPT说使用
==
运算符会产生一次内存拷贝。
下面Golang
源码bytes
包的Equal(a, b []byte) bool
函数的实现:
// Equal reports whether a and b
// are the same length and contain the same bytes.
// A nil argument is equivalent to an empty slice.
func Equal(a, b []byte) bool {
// Neither cmd/compile nor gccgo allocates for these string conversions.
return string(a) == string(b)
}
然后我根据ChatGPT对bytes.Equal
的描述,实现了一个类似的函数:
//比较两个字符串是否相等
func StringEqual(a, b string) bool {
if len(a) != len(b) {
return false
} else if len(a) == 0 {
return true
}
//这里利用unsafe提供的方法,将字符串无内存开销的转成字节切片,比ChatGPT描述的更优
x := unsafe.Slice(unsafe.StringData(a), len(a))
y := unsafe.Slice(unsafe.StringData(b), len(b))
//逐字节对比,不一致立刻返回
for k, v := range x {
if y[k] != v {
return false
}
}
return true
}
然后我根据ChatGPT的提示,对比较字符串是否相等的方式进行了多角度的测试。
其中bytes.Equal
函数被我替换成了自己实现的StringEqual
函数,因为bytes.Equal
的内部实现就是==
运算符。EqualFold
是Golang
源码strings
包的函数。
测试结果如下:
aaa vs aaa
== 1.843 ns/op 0 B/op 0 allocs/op
EqualFold 5.608 ns/op 0 B/op 0 allocs/op
StringEqual 3.042 ns/op 0 B/op 0 allocs/op
aaa vs bbb
== 4.024 ns/op 0 B/op 0 allocs/op
EqualFold 3.119 ns/op 0 B/op 0 allocs/op
StringEqual 1.912 ns/op 0 B/op 0 allocs/op
aaa vs ""
== 0.7936 ns/op 0 B/op 0 allocs/op
EqualFold 2.870 ns/op 0 B/op 0 allocs/op
StringEqual 0.7891 ns/op 0 B/op 0 allocs/op
006406F42C0757B750 vs 006406F42C0757B750
== 1.852 ns/op 0 B/op 0 allocs/op
EqualFold 16.39 ns/op 0 B/op 0 allocs/op
StringEqual 13.46 ns/op 0 B/op 0 allocs/op
006406F42C0757B750 vs 006406F42C0757B783
== 5.087 ns/op 0 B/op 0 allocs/op
EqualFold 22.26 ns/op 0 B/op 0 allocs/op
StringEqual 12.44 ns/op 0 B/op 0 allocs/op
006406F42C0757B750 vs ""
== 0.7845 ns/op 0 B/op 0 allocs/op
EqualFold 2.799 ns/op 0 B/op 0 allocs/op
StringEqual 0.8201 ns/op 0 B/op 0 allocs/op
从测试结果可以得出两个结论:
==
运算符是比较字符串是否相等的最快最稳的方式。==
运算符在做字符串比较的时候并没有内存的分配开销。
最后说说感慨
- 以后这种机器人成熟了,不是说人类就不用思考和学习了,反而是要更卷,否则它说什么就是什么,自己毫无判断能力,那就是
ai
时代的文盲了。 - 针对编程的提问,它的回答还是非常厉害的,如果回答其它的理科问题也这么秀,那就you’di
本作品采用《CC 协议》,转载必须注明作者和本文链接
问他个简单的计算题:怎么证明哥德巴赫猜想