美文网首页
爬虫遇到了点问题

爬虫遇到了点问题

作者: 进击云原生 | 来源:发表于2018-09-01 22:52 被阅读32次

    golang爬珍爱网代码优化后,运行报了如下的错,找了半小时才找到原因,在此记录一下。

    image

    代码是这样的:

    有一个interface类型的Parser:

    type Parser interface {
        Parser(contents []byte, url string) ParserResult
        Serialize() (funcName string, args interface{})
    }
    

    有一个struct类型的FuncParser:

    type FuncParser struct {
        parser ParserFunc
        funcName string
    }
    

    FuncParser 实现了Parser 接口:

    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
    }
    

    抛开爬虫代码整体的复杂度,将代码简化到如下这样:

    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)

    image.png

    实际上goland里已经提示了Recursive Call

    image.png

    一不小心就会写出这种代码,再看如下代码:

    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坑,励志成为优秀的程序猿,那么这些资源很适合你,包括java、go、python、springcloud、elk、嵌入式 、大数据、面试资料、前端等资源。同时我们组建了一个技术交流群,里面有很多大佬,会不定时分享技术文章,如果你想来一起学习提高,可以关注以下公众号后回复【2】,获取。


    我是小碗汤,我们一起学习,扫码关注,精彩内容第一时间推给你

    欢迎扫码关注

    相关文章

      网友评论

          本文标题:爬虫遇到了点问题

          本文链接:https://www.haomeiwen.com/subject/ehxpwftx.html