Go+,GoPlus 爬虫第一例

举报
梦想橡皮擦 发表于 2021/12/24 08:20:38 2021/12/24
【摘要】 原计划,继续将 Go+ 的手册在翻译一下,结果发现没了~,为了继续学习,那只能用 Go+ 写一个爬虫了。 GoPlus 爬虫本次要采集站点为 Go+ 的手册,地址为:https://tutorial.goplus.org/,采集该站点需要用到 Go+ 的包。这一部分的实现 ,Go+ 与 Go 基本一致,完整代码如下所示:import ( "io/ioutil" "net/http" "reg...

原计划,继续将 Go+ 的手册在翻译一下,结果发现没了~,为了继续学习,那只能用 Go+ 写一个爬虫了。

GoPlus 爬虫

本次要采集站点为 Go+ 的手册,地址为:https://tutorial.goplus.org/,采集该站点需要用到 Go+ 的包。

这一部分的实现 ,Go+ 与 Go 基本一致,完整代码如下所示:

import (
	"io/ioutil"
	"net/http"
	"regexp"
)

resp, err := http.Get("https://tutorial.goplus.org/")

body, err := ioutil.ReadAll(resp.Body)
if err != nil {
	println("read error", err)
	return
}

//println(string(body))

pattern := `<li><a class="example-link" href="\/(.*?)">(.*?)</a></li>`
reg := regexp.MustCompile(pattern)
items := reg.FindAllString(string(body), -1)

println(items)
for _, item <- items {
	println item
}

其中涉及 io/ioutilnet/httpregexp 包的使用,编写这部分过程中,发现Go+与Go的兼容性还是蛮强的。

但也碰到了一个比较绕的地方,如果能有官方团队辅助解答一下就非常 nice 。

案例已经写完,下面翻译一下 Error-Handling 的官方手册。

Go+ 重写编写了Go的错误处理规范,并将其称之为 ErrWrap expressions

查阅相关内容之后,找到了如下这篇文章
https://github.com/goplus/gop/wiki/Error-Handling

Error Handling(错误处理)

Go+ 中重新发明了错误处理规范,称之为 ErrWrap expressions

expr! // panic if err
expr? // return if err
expr?:defval // use defval if err

使用案例

import (
	"strconv"
)

func add(x, y string) (int, error) {
	return strconv.Atoi(x)? + strconv.Atoi(y)?, nil
}

func addSafe(x, y string) int {
	return strconv.Atoi(x)?:0 + strconv.Atoi(y)?:0
}

println(`add("100", "23"):`, add("100", "23")!)

sum, err := add("10", "abc")
println(`add("10", "abc"):`, sum, err)

println(`addSafe("10", "abc"):`, addSafe("10", "abc"))

案例的输出内容

add("100", "23"): 123
add("10", "abc"): 0 strconv.Atoi: parsing "abc": invalid syntax

===> errors stack:
main.add("10", "abc")
	/Users/xsw/goplus/tutorial/15-ErrWrap/err_wrap.gop:6 strconv.Atoi(y)?

addSafe("10", "abc"): 10

与相应的 Go 代码相比,它更清晰、更具可读性。
最有趣的是,返回错误包含完整的错误堆栈。当我们遇到错误时,很容易定位根本原因是什么。

上述内容是官方自带的翻译,下面进入正题。

如何使用 ErrWrap expressions

所有的 ErrWrap expressions 都假设 expr (大多数情况下,它是一个函数调用)具有多个值(val1, val2,…, valN),而 valN 可以赋给一个 error 变量。

expr! 表达式用来检查 valN 是否为 nil ,如果不是,就会抛出异常,即程序发生错误(panic),下面是一个 Go 的案例

val1, val2, ..., valN1, valN := expr
if valN != nil {
    panic(errors.NewFrame(valN, ...))
}
val1, val2, ..., valN1 // value of `expr!`

expr? 表达式 检查 valN 是否为 nil ,如果不是,则返回错误,该语法需要 exor? 表达式返回的参数具备 error 类型,下面是对应的Go代码。

val1, val2, ..., valN1, valN := expr
if valN != nil {
    _ret_err = errors.NewFrame(valN, ...)
    return
}
val1, val2, ..., valN1 // value of `expr?`

expr?:defval 表达式检查 valN 是否为 nil ,如果不是,它使用 defval 作为表达式 expr 的值,所以它需要 expr 表达式有两个值 (val1, val2)

val1, val2 := expr
if val2 != nil {
    val1 = defval
}
val1 // value of `expr?:defval`
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。