爬蟲遇到了點問題

golang爬珍愛網代碼優化後,運行報了以下的錯,找了半小時才找到緣由,在此記錄一下。前端

image

代碼是這樣的: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

image.png

實際上goland裏已經提示了Recursive Call編程

image.png

一不當心就會寫出這種代碼,再看以下代碼: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)
}

一樣報錯:
image.png

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.

正常代碼應該以下:

image.png

實際上,goland裏也會警告該問題的:
image.png

看來平時編寫代碼,警告仍是得注意的。

項目代碼見:https://github.com/ll837448792/crawler



本公衆號免費提供csdn下載服務,海量IT學習資源,若是你準備入IT坑,勵志成爲優秀的程序猿,那麼這些資源很適合你,包括但不限於java、go、python、springcloud、elk、嵌入式 、大數據、面試資料、前端 等資源。同時咱們組建了一個技術交流羣,裏面有不少大佬,會不定時分享技術文章,若是你想來一塊兒學習提升,能夠公衆號後臺回覆【2】,免費邀請加技術交流羣互相學習提升,會不按期分享編程IT相關資源。


掃碼關注,精彩內容第一時間推給你

image

相關文章
相關標籤/搜索