最近看到 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-05-03 23:45:14 +08:00 3
|
2
imcj 2018-05-04 00:35:23 +08:00 1
如果你仔细看看各种语言实现,你会发现很多函数只有定义没有实现。这是因为实现在另外一个盒子里面。
countByte 是由.s 文件实现,根据 google 的搜索,.s 是由 c 编译器编译。 就好像 SYSCALL_CANCEL 由内核实现,c 代码里面是没有这个“函数”的实现的。 go 实现了自举,但是并没有完全抛弃 c。 |
4
dndx 2018-05-04 05:14:45 +08:00 1
|
5
jy02201949 2018-05-04 09:05:34 +08:00
如果楼主去看 python 库源码也会得出同样的结论
|
6
misaka19000 2018-05-04 09:21:17 +08:00
看代码看的不仔细啊,允悲~~
|
7
ylcc 2018-05-04 09:28:06 +08:00
那看 python 源码就会认为有一大堆没实现的了。。。
|
8
thincamel 2018-05-04 09:30:28 +08:00
妈蛋的,学的汇编都还给先生了...
|
11
natscat 2018-05-04 10:57:56 +08:00
汇编实现的 runtime 里面一堆
|