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相關資源。
掃碼關注,精彩內容第一時間推給你