最近中文字幕高清中文字幕无,亚洲欧美高清一区二区三区,一本色道无码道dvd在线观看 ,一个人看的www免费高清中文字幕

為了賬號安全,請及時綁定郵箱和手機立即綁定

爬蟲遇到了點問題

標簽:
Go

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

看来平时编写代码,警告还是得注意的。



點擊查看更多內(nèi)容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優(yōu)質(zhì)文章

正在加載中
JAVA開發(fā)工程師
手記
粉絲
5
獲贊與收藏
25

關(guān)注作者,訂閱最新文章

閱讀免費教程

  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優(yōu)惠券免費領(lǐng)

立即參與 放棄機會
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號

舉報

0/150
提交
取消