golang爬珍爱网代码优化后,运行报了以下的错,找了半小时才找到缘由,在此记录一下。前端
代码是这样的:java
有一个interface类型的Parser:python
type Parser interface { Parser(contents []byte, url string) ParserResult Serialize() (funcName string, args interface{}) }
有一个struct类型的FuncParser:git
type FuncParser struct { parser ParserFunc funcName string }
FuncParser 实现了Parser 接口:github
func (f *FuncParser) Parser(contents []byte, url string) ParserResult { return f.Parser(contents, url) } func (f *FuncParser) Serialize() (funcName string, args interface{}) { return f.funcName, nil }
抛开爬虫代码总体的复杂度,将代码简化到以下这样:golang
type ParserFunc func(url string) string type FuncParser struct { parser ParserFunc } func (f *FuncParser) Parser(url string) string { return f.Parser(url) } func main() { funcParse := FuncParser{ func(url string) string { return url }, } funcParse.Parser("http://www.zhenai.com/zhenghun") }
一样运行代码后一样会报错:面试
runtime: goroutine stack exceeds 1000000000-byte limit fatal error: stack overflow runtime stack: runtime.throw(0x467297, 0xe) D:/Program Files/Go/go103/src/runtime/panic.go:616 +0x88 runtime.newstack() D:/Program Files/Go/go103/src/runtime/stack.go:1054 +0x72d runtime.morestack() D:/Program Files/Go/go103/src/runtime/asm_amd64.s:480 +0x91
这个示例就很明显了,FuncParser的Parser里造成了递归调用(本身调本身),
递归调用自身致使栈溢出,致使报错。应该改为这样:(小写的parser)spring
实际上goland里已经提示了Recursive Call编程
一不当心就会写出这种代码,再看以下代码:segmentfault
package main import ( "fmt" ) type Str string func (s Str) String() string { return fmt.Sprintf("Str: %s", s) } func main() { var s Str = "hi" fmt.Println(s) }
一样报错:
You are implementing Str.String in terms of itself. return fmt.Sprintf("Str: %s", s) will call s.String(), resulting in infinite recursion. Convert s to string first.This is working as intended, you are using the %s verb to call Str's String method, which uses fmt.Sprint to call Str's String method, and so on.
正常代码应该以下:
实际上,goland里也会警告该问题的:
看来平时编写代码,警告仍是得注意的。
项目代码见:https://github.com/ll837448792/crawler
本公众号免费提供csdn下载服务,海量IT学习资源,若是你准备入IT坑,励志成为优秀的程序猿,那么这些资源很适合你,包括但不限于java、go、python、springcloud、elk、嵌入式 、大数据、面试资料、前端 等资源。同时咱们组建了一个技术交流群,里面有不少大佬,会不定时分享技术文章,若是你想来一块儿学习提升,能够公众号后台回复【2】,免费邀请加技术交流群互相学习提升,会不按期分享编程IT相关资源。
扫码关注,精彩内容第一时间推给你