最近看到 go 的源码库,比如 bytes 库
Count()函数如下:
func Count(s, sep []byte) int {
if len(sep) == 1 && cpu.X86.HasPOPCNT {
return countByte(s, sep[0])
}
return countGeneric(s, sep)
}
然后看了下 countByte 库写法是下面这样:
func countByte(s []byte, c byte) int
库函数为什么可以这么写呢?没有实体?不应该语法报错吗?怎么执行呢? 来位好心人解释下吧!
1
mornlight 2018 年 5 月 3 日 |
2
imcj 2018 年 5 月 4 日 如果你仔细看看各种语言实现,你会发现很多函数只有定义没有实现。这是因为实现在另外一个盒子里面。
countByte 是由.s 文件实现,根据 google 的搜索,.s 是由 c 编译器编译。 就好像 SYSCALL_CANCEL 由内核实现,c 代码里面是没有这个“函数”的实现的。 go 实现了自举,但是并没有完全抛弃 c。 |
4
dndx 2018 年 5 月 4 日 |
5
jy02201949 2018 年 5 月 4 日
如果楼主去看 python 库源码也会得出同样的结论
|
6
misaka19000 2018 年 5 月 4 日
看代码看的不仔细啊,允悲~~
|
7
ylcc 2018 年 5 月 4 日
那看 python 源码就会认为有一大堆没实现的了。。。
|
8
thincamel 2018 年 5 月 4 日
妈蛋的,学的汇编都还给先生了...
|
11
natscat 2018 年 5 月 4 日
汇编实现的 runtime 里面一堆
|