【焦点热闻】GO 1.20 新功能:多重错误包装
预计将于2023年2月发布的Go1 20有一个小的变化,对于那些大量使用错误包装的应用程序来说,可能会有效...
2022-12-28预计将于 2023 年 2 月发布的 Go 1.20 有一个小的变化,对于那些大量使用错误包装的应用程序来说,可能会有效改进它们的错误处理方法。
让我们看一下它的用法,但首先,需要简要回顾一下什么是错误包装。如果你已经掌握了可以直接跳到下面的 “Go 1.20 新功能” 部分以获取新的信息。
Go 中的错误是实现一个非常简单的接口:
(资料图)
typeerrorinterface{Error()string}错误类型可以是任何东西,从string本身到int,但通常它们是struct类型。下面这个例子来自标准库:
typeerrstruct{sstring}func(e*err)Error()string{returne.s}要检查 Go 中的错误,你只需比较一个值(在本例中为int值):
iferr==io.EOF{//...}第二种常见的用法是检查错误的类型,那也意味着要写更多的代码:
ifnerr,ok:=err.(net.Error){//...(usenerrwhichisanet.Error)}在上面的例子中,类型断言测试类型net.Error的err值,并创建一个新变量nerr,它可以在 if 语句中使用。Go 中的错误方便理解、易于使用且非常高效。
错误包装从 Go 1.13 开始,引入了错误包装。包装允许将错误嵌入到其他错误中,就像在其他语言中包装异常一样。这非常实用,比如函数遇到 “record not found” 错误时,可以向错误信息中添加更多上下文信息,例如 “unknown user: record not found”。
Go 中错误包装设计背后的有趣想法是:契约不用关心错误类型、结构或它们是如何创建的。而唯一关注的是解包过程和转换为字符串,因为这两者是必须的。这就非常容易实现:支持解包的错误类型必须实现Unwrap() error方法。
标准库中没有(命名的)接口可以向您展示,因为接口是隐式实现的,没有必要单独写一个。这里我们写一个只是为了更好说明这篇文章:
typeWrappedErrorinterface{Unwrap()error}我们来看看 Go 标准库(实际上是 package fmt)中是如何实现包装错误的:
typewrapErrorstruct{msgstringerrerror}func(e*wrapError)Error()string{returne.msg}func(e*wrapError)Unwrap()error{returne.err}由于上面错误类型实现了Error() string方法,所以说 Go 中的错误实际上最终是字符串并没有错,因此需要一种创建这些字符串的良好机制。这就是标准库中的函数fmt.Errorf发挥作用的地方:
varRecordNotFoundErr=errors.New("notfound")constname,id="lzap",13werr:=fmt.Errorf("unknownuser%q(id%d):%w",name,id,recordNotFoundErr)fmt.Println(werr.Error())一个特殊格式的动词%w,每次调用只能使用一次(稍后会详细介绍),用于错误参数。除此之外,该函数的工作方式类似于fmt.Printf函数。下面的例子打印了这个结果:
unknownuser"lzap"(id13):notfound
如你所见,错误包装本质上是一个链表。要解包错误,请使用errors.Unwrap函数,该函数将为链表中的最后一个错误值返回nil。要检查错误类型或值,需要遍历整个列表,这对于需要进行频繁的错误检查不太实用。幸运的是,有两个辅助函数可以做到这一点。
检查包装错误列表中的值:
iferrors.Is(err,RecordNotFoundErr){//...}检查特定类型(下面例子是来自标准库的网络错误):
varnerr*net.Erroriferrors.As(err,&nerr){//...(usenerrwhichisa*net.Error)}以上总结了 Go 1.13 及更高版本中的错误包装。
Go 1.20 新特性让我们看看 Go 1.20 中真正的新功能,从函数errors.Join开始,它通过可变参数包装错误列表:
err1:=errors.New("err1")err2:=errors.New("err2")err:=errors.Join(err1,err2)fmt.Println(err)当事先不知道错误数量时,此功能可用于将错误连接在一起。一个很好的例子是从 goroutines 收集错误。值得一提的是,该函数将列表中的错误与换行符连接起来。上面的代码片段打印:
err1err2
对于许多应用程序或(日志记录)库来说,这可能会存在问题,它们期望错误通常只是没有换行符的字符串。幸运的是,Go 1.20 中的另一个变化改变了fmt.Errorf的行为:该函数现在接受多个%w格式说明符:
err1:=errors.New("err1")err2:=errors.New("err2")err:=fmt.Errorf("%w+%w",err1,err2)fmt.Println(err)以前会导致格式错误的格式字符串现在可以正确打印:
err1+err2
同时包装多个错误实现Unwrap() error,这是可能的吗?
事实证明,在 Go 1.20 标准库中有一种新的机制: 实现Unwrap() []error函数的错误类型可以包装多个错误。让我们来看看这是如何在库中实现的:
typejoinErrorstruct{errs[]error}func(e*joinError)Error()string{//concatenateerrorswithanewlinecharacter}func(e*joinError)Unwrap()[]error{returne.errs}一个理论上的接口,但标准库中实际不存在,如下所示:
typeMultiWrappedErrorinterface{Unwrap()[]error}由于 Go 不允许方法重载,因此每种类型都可以实现Unwrap() error或Unwrap() []error,但不能同时实现。还记得我提到过包装错误本质上是一个链表吗?实现前一个(新引入的)方法的类型实际上形成了一个链接树,函数errors.Is和errors.As的工作方式相同,只是现在它们需要遍历树而不是列表。根据文档,该实现执行预排序、深度优先遍历。
这确实是 Go 1.20 带来的全部,它可能看起来是一个小的变化,但它提供了如何有效和干净地处理错误的新方法。在展示真实示例之前,让我总结一下新功能:
新的Unwrap []error函数契约允许遍历错误树。
新的errors.Join函数,这是一个方便的函数,用于连接两个错误字符串值(使用换行符)。
现有函数errors.Is和errors.As已更新,可以同时处理错误列表和错误树。
现有函数fmt.Errorf现在接受多个%w格式动词。实践上面这一切都很棒,但是你如何在实践中利用它呢?
在一个小型 REST API 微服务中,我们通过errors.New和fmt.Errorf处理来自 DAO 包(数据库)、REST 客户端(其他后端服务)和其他包的各种错误。返回的 HTTP 状态代码应该是 2xx、4xx 或 5xx,具体取决于错误状态以遵循最佳 REST API 实践。实现此过程的一种方法是解开主 HTTP 处理程序中的错误并找出它是哪种错误。
然而,通过多重错误包装,现在可以包装根本原因(例如数据库返回 “no records found” )和返回给用户 HTTP 代码(在本例中为 404)。
一个工作示例如下所示:
packagemainimport("errors""fmt")//commonHTTPstatuscodesvarNotFoundHTTPCode=errors.New("404")varUnauthorizedHTTPCode=errors.New("401")//databaseerrorsvarRecordNotFoundErr=errors.New("DB:recordnotfound")varAffectedRecordsMismatchErr=errors.New("DB:affectedrecordsmismatch")//HTTPclienterrorsvarResourceNotFoundErr=errors.New("HTTPclient:resourcenotfound")varResourceUnauthorizedErr=errors.New("HTTPclient:unauthorized")//applicationerrors(thenewfeature)varUserNotFoundErr=fmt.Errorf("usernotfound:%w(%w)",RecordNotFoundErr,NotFoundHTTPCode)varOtherResourceUnauthorizedErr=fmt.Errorf("unauthorizedcall:%w(%w)",ResourceUnauthorizedErr,UnauthorizedHTTPCode)funchandleError(errerror){iferrors.Is(err,NotFoundHTTPCode){fmt.Println("Willreturn404")}elseiferrors.Is(err,UnauthorizedHTTPCode){fmt.Println("Willreturn401")}else{fmt.Println("Willreturn500")}fmt.Println(err.Error())}funcmain(){handleError(UserNotFoundErr)handleError(OtherResourceUnauthorizedErr)}这将打印:
Willreturn404usernotfound:DB:recordnotfound(404)Willreturn401unauthorizedtocallotherservice:HTTPclient:unauthorized(401)
从这样的人工代码片段中可能看起来不太明显的是,实际上的错误声明通常分布在许多包中,并且不容易跟踪所有可能的错误以确保所需的 HTTP 状态代码。在这种方法中,所有在一个地方声明的应用程序级包装错误也包含了 HTTP 代码。
请注意,这在 Go 1.19 或更早版本中是不可能的,因为fmt.Errorf函数只会包装第一个错误。该代码确实在 1.19 上可以编译,甚至不会产生运行时恐慌,但它实际上不会工作。
显然,常见的 HTTP 状态代码很容易成为一种新的错误类型(基于int类型),因此可以通过errors.As轻松提取实际代码,但我想让示例保持简单。
Feel free to play around with the code on Go Playground. Make sure to use “dev branch” or 1.20+ version of Go. 可以在 Go Playground 上自由运行上述代码。确保使用 “dev branch” 或 Go 的 1.20+ 版本。现有应用在你的应用程序中实施新功能时,请注意errors.Unwrap函数。对于具有Unwrap() []error的错误类型,它总是返回nil:
err1:=errors.New("err1")err2:=errors.New("err2")err:=errors.Join(err1,err2)unwrapped:=errors.Unwrap(err)fmt.Println(unwrapped)由于 Go 1.X 兼容性承诺,这会打印出 “nil”。当你引入多个包装错误时,请确保检查展开代码。幸运的是,典型 Go 代码中的大部分错误检查都是使用errors.Is和errors.As完成的。
错误包装并不是 Go 中所有错误处理的最终解决方案。它只是提供了一种干净的方法来处理典型 Go 应用程序中的错误,对于简单应用程序来说也许就完全足够了。原文地址:https://lukas.zapletalovi.com/posts/2022/wrapping-multiple-errors/原文作者:Lukáš Zapletal本文永久链接:https://github.com/gocn/translator/blob/master/2022/w50_Wrapping_multiple_errors译者:haoheipi校对:watermelo
往期推荐
谷歌发布查找开源漏洞的Go工具OSV-Scanner最好的Go框架:没有框架?
「每周译Go」如何在Go中构造For 循环想要了解Go更多内容,欢迎扫描下方关注公众号,回复关键词 [实战群],就有机会进群和我们进行交流
分享、在看与点赞Go
标签:
预计将于2023年2月发布的Go1 20有一个小的变化,对于那些大量使用错误包装的应用程序来说,可能会有效...
2022-12-28
12月27日,北京易诚互动网络技术股份有限公司(下称“易诚互动”)在深圳证券交易所更新招股书,准备在...
2022-12-28
截至2022年12月27日收盘,坤恒顺维(688283)报收于58 72元,上涨5 38%,换手率2 08%,成交量3872 93手,成交额2222 5万元。
2022-12-28
本期主播丨精灵“邓先生变了。”前阵子,孙俪微博晒照片“控诉”邓超。短短一句话,却充满爱意。画面中...
2022-12-27
网贷逾期一般会上征信,有些借贷机构在用户逾期后一天后就会上报给征信机构,而有些借贷机构则是会在几天...
2022-12-27
卓创资讯(301299)12月27日在投资者关系平台上答复了投资者关心的问题。
2022-12-27
网贷逾期一般会上征信,有些借贷机构在用户逾期后一天后就会上报给征信机构,而有些借贷机构则是会在几天...
2022-12-27
2022年5月,市场监管总局依据《反垄断法》对知网涉嫌实施垄断行为立案调查。调查期间,市场监管总局成立...
2022-12-26
12月26号凌晨,娱乐圈再度传出悲痛消息,来自北影的花旦李长乐不幸因病去世,终年84岁,电影人余泳特地...
2022-12-26
现在各种炫彩的RGB灯光已经不满足玩家们的要求了,尤其是键盘带灯更是平常,甚至每个按键都自定义灯效的...
2022-12-26
12月18日,广安高新区,在四川拓普汽车部件有限公司刚租下的一个生产厂房中,数名工人正在安装3台用于汽...
2022-12-25
每经投研院研究员周欢每经编辑董兴生 2022年12月9日,全球首架国产大飞机C919正式交付给东航。C919的...
2022-12-24
重庆农村商业银行(03618 HK)公布,2022年1月30日,重庆市第五中级人民法院作出(2021)渝05破申665号-677号民事裁定,
2022-12-23
冰川网络(300533)12月23日在投资者关系平台上答复了投资者关心的问题。
2022-12-23
证券时报网讯,数据宝统计,近五个交易日的龙虎榜当中,78只个股出现了机构的身影,其中30只股票呈现机...
2022-12-23
格隆汇12月22日丨创益通(300991 SZ)公布,为了满足公司业务发展需要,进一步拓展海外市场,更好地响应...
2022-12-22
截至2022年12月22日收盘,拾比佰(831768)报收于5 35元,下跌0 19%,换手率0 11%,成交量850 62手,成交额45 43万元。12月22
2022-12-22
钱江摩托(000913)12月22日在投资者关系平台上答复了投资者关心的问题。投资者:贵司投资者调研中提到的...
2022-12-22
2022年12月21日,NMN概念受到利好消息的刺激下,整个板块掀起了涨停潮。共3家涨停。1板:1、友阿股份(00...
2022-12-21
欧普康视(300595)12月21日在投资者关系平台上答复了投资者关心的问题。
2022-12-21
邢昭林、胡冰卿主演的网剧《一不小心喵上你》今晚18点在爱奇艺上映,该剧讲述了元气运动少女周天(胡冰...
2022-12-21
今年英镑兑欧元已经处于下跌趋势,而在策略师看来,这一汇率可能会在2023年有再次下跌的风险。目前英国...
2022-12-20
人保寿险“福寿年年”上央视,首批入选个人养老金产品
2022-12-20
12月19日,梅西带领阿根廷队夺冠后,本届卡塔尔世界杯也随之落下帷幕。尽管世界杯结束,但“世界杯效应...
2022-12-20
屯者聚也,溪者水流也,山水聚合便是安徽省黄山市屯溪地名的由来。昱城,又是它的雅称,这座日光照耀下...
2022-12-19
维康药业(300878)12月19日在投资者关系平台上答复了投资者关心的问题。投资者:请问公司有没有治疗感冒...
2022-12-19
[据第一财经统计,若剔除今年成立的新基金且仅计算初始基金,、万家新利、万家精选A分别以57 6%、52 2...
2022-12-19
根据相关法律对于抢夺致人轻伤判几年的规定作出以下回答,1、犯本罪的,处三年以下有期徒刑、拘役或者管...
2022-12-18
网贷逾期一般会上征信,有些借贷机构在用户逾期后一天后就会上报给征信机构,而有些借贷机构则是会在几天...
2022-12-17
截至2022年12月16日收盘,通化东宝(600867)报收于9 52元,上涨1 17%,换手率0 53%,成交量10 61万手...
2022-12-17
格隆汇12月16日丨联创光电(600363)(600363 SH)发布关于公司2020年限制性股票激励计划第二个解除限售期...
2022-12-16
【电缆网讯】3月2日,特变电工股份有限公司(证券代码:600089证券简称:特变电工)发布的对外投资公告...
2022-12-16
首先你要清楚什么是生产、销售假冒伪劣严品罪。生产、销售伪劣产品罪是指生产者、销售者在产品中掺杂、...
2022-12-16
证券代码:688219 证券简称:会通股份 公告编号:2022-071 ...
2022-12-15
蔚蓝锂芯(002245)12月15日在投资者关系平台上答复了投资者关心的问题。投资者:您好董秘,请问贵公司在...
2022-12-15
到目前为止,玻璃市场上的事情“我一高兴就说”你以为我是一年级的孩子吗?电池!在中国古代,屏风和玻...
2022-12-15
苏大维格(300331)12月14日在投资者关系平台上答复了投资者关心的问题。投资者:董秘你好,公司在新材料...
2022-12-14
12月11日上午,笔者在调丰村毛豆种植基地里看到,在冬日明媚的暖阳下,40多位村民正在摘豆、分拣、打包...
2022-12-14
新冠肺炎疫情爆发后,道恩股份聚丙烯熔喷专用料为抗击疫情贡献了“道恩力量”。日前,从道恩股份获悉,...
2022-12-13
鹏翎股份(300375)12月13日在投资者关系平台上答复了投资者关心的问题。投资者:王志方跨界收购贵公司股...
2022-12-13
1、产生罚息这是金钱上的损失。如果信用贷款出现逾期,贷款机构会先电话催收贷款,提醒借款人还款,同时...
2022-12-13
本报讯(记者渠稳)1月25日下午,市长唐远游到市行政服务中心、12345市长热线办公室、市公共资源交易中...
2022-12-12
央视新闻客户端近日,全国总工会发布2022年“最美工会户外劳动者服务站点”名单,北京市东城区建国门街...
2022-12-12
截至2022年12月9日收盘,中泰证券(600918)报收于6 95元,较上周的6 85元上涨1 46%。本周,中泰证券...
2022-12-09
创世纪(300083)12月08日在投资者关系平台上答复了投资者关心的问题。投资者:您好。贵公司今年三份财报...
2022-12-08
寿仙谷(603896)12月07日在投资者关系平台上答复了投资者关心的问题。投资者:据说你们公司的拳头产品寿...
2022-12-07
养殖池塘水深控制在多少最合适?首先,对于工厂化水产养殖来说,水深要求在0 8到1 2米,亩产过万都是默...
2022-09-22
华西证券(002926)股份有限公司周莎近期对国联水产(300094)进行研究并发布了研究报告《经营持续向好,水...
2022-08-26近日,记者从兰州市人社局了解到,兰州市政府审议通过的《兰州市落实强省会战略进一步优化营商环境若干...
2022-06-20
这款交友App,把我们家闹得鸡飞狗跳。武汉市民刘女士说,家里老人看了网络广告下载了一款中老年社交App...
2022-03-18
政府工作报告提出,增强区域发展平衡性协调性。推进京津冀协同发展、长江经济带发展、粤港澳大湾区建设...
2022-03-18
山东适宜线下无理由退货的实体店大约35万家,今年将实现这些实体店无理由退货全覆盖。日前,记者从山东...
2022-03-18
2月18日,离岸人民币兑美元汇率大幅上调,盘中一度突破6 3200关口,触及近4年新高6 3144,创下2018年5...
2022-03-18
近日,厦门海关对外发布消息称,RCEP实施首月,厦门海关签发RCEP原产地证书1013份,货值4 98亿元人民币...
2022-03-18
在今天国新办举行的新闻发布会上,商务部部长王文涛表示,今年外贸形势严峻复杂,稳外贸压力增大,商务...
2022-03-18
我们通过落实各项稳外资措施,积极促成亚洲硅业(青海)股份有限公司在甘河工业园区再投资建设年产60000吨...
2022-03-18
近日,宝鸡2021年外贸数据公布:外贸进出口总值88 1亿元,同比增长10 9%,创历史新高。能取得这样的成...
2022-03-18
中新网11月26日电 据厦门大学微信公众号消息,11月25日18:00,上海市召开新冠肺炎疫情防控新闻发布...
2021-11-26(抗击新冠肺炎) 江西本轮疫情新冠肺炎住院确诊病例“清零” 中新网南昌11月26日电 (记者 吴鹏...
2021-11-26中新网11月26日电 据“徐州发布”微博消息,江苏省徐州市疫情防控应急指挥部发布疫情防控工作进展...
2021-11-26(抗击新冠肺炎)上海逾5万名筛查对象核酸检测阴性 中新社上海11月26日电 (记者 陈静)上海25日新...
2021-11-26
中新网湖州11月26日电(记者 施紫楠)今年是波兰姑娘杰西卡在中国乡村生活的第9年。对于她来说,中国...
2021-11-26中新网杭州11月26日电 题:浙大不眠夜:罕见亮起“灿烂星辰”灯 守护师生前行 作者 谢盼盼 ...
2021-11-26【聚焦2021中国网络媒体论坛展示会】 “宝鸡元素”备受追捧 11月24日—26日,2021中国网络媒体...
2021-11-26
中新网杭州11月26日电(张煜欢)25日,杭州市新增两例无症状感染者。26日,杭州市新冠肺炎疫情防控指...
2021-11-26中新网11月26日电 据“杭州发布”微信公众号消息,在通报杭州2例无症状感染者后,杭州市加快推进流...
2021-11-26
中新网兰州11月26日电 (陈强)“终于有稳定的水源供应了。”看着水管里流出的清澈山泉水,甘肃省平...
2021-11-26
这两天,来自单亲家庭的山东青岛女孩刘郦微休学一年陪伴患病妈妈的视频感动无数网友。然而不幸的是...
2021-11-26
中新网大连11月26日电 (记者 杨毅)大连市新冠肺炎疫情防控总指挥部26日发布通告,11月25日0时至24...
2021-11-26中新网11月26日电 据北京市卫健委微信公众号消息,截至2021年11月25日,北京市海淀区西三旗街道富...
2021-11-26记者从山西省临汾市吉县相关部门了解到,11月25日,临汾市吉县一在建乡村道路发生塌方,造成3人遇难...
2021-11-26中新网11月26日电 据河南省封丘县政府网站消息,11月25日,有媒体报道封丘县《学生餐后集体呕吐腹...
2021-11-26
中新网杭州11月26日电(王逸飞 钱晨菲)11月25日,杭州市通报两名来杭返杭人员诊断为新冠病毒无症...
2021-11-26中新网南京11月26日电 (记者 钟升)苏州市政府新闻办公室25日深夜公布,截至当日22时,苏州市已累...
2021-11-26
近日,“毒贩母亲”一事引发网友关注。河南郑州一名35岁的母亲李芳(化名)长期代购一款名为氯巴占的...
2021-11-26中新网11月26日电 据内蒙古自治区卫健委网站消息,11月25日0—24时,内蒙古自治区报告无新增确诊病...
2021-11-26中新网11月26日电 据江苏省卫健委官方微博消息,11月25日0-24时,江苏无新增确诊病例,新增本土无...
2021-11-26中新网11月26日电 据北京疾控中心微信公众号消息,11月25日18:00,上海市召开第107场新冠肺炎疫情...
2021-11-26上海瑞金医院、中山医院、同济医院、闵行区中心医院25日均发布消息称,根据国家和上海疫情防控要求...
2021-11-26走近年轻的视障工程师—— 为视障者点亮智慧生活(体验·新时代·追梦人·“急难愁盼这样解决”)...
2021-11-26
中新网11月26日电 据“上海发布”微博消息,11月26日,上海市疫情防控工作领导小组办公室发布消息...
2021-11-26每逢求职季,不少应届毕业生心头难免萦绕迷茫与焦虑——学历够高吗?学校够牛吗? 在江苏省常熟...
2021-11-26中新网11月26日电 据辽宁省卫健委网站消息,11月25日0时至24时,辽宁省新增1例本土新冠肺炎确诊病...
2021-11-26规范性文件升格为部门规章拖欠农民工工资联合惩戒力度加大 列入失信惩戒名单期限内再次欠薪不予...
2021-11-26中新网11月26日电 据上海市卫健委官方微博消息,2021年11月25日0—24时,通过口岸联防联控机制,上...
2021-11-26中新网11月26日电 据“徐州发布”微信公众号消息,江苏省徐州市疫情防控应急指挥部25日发布《交通...
2021-11-26
中新网11月26日电 据中央气象台网站消息,27日至28日,新疆、西北地区东部、川西高原、西藏东部等...
2021-11-262021年11月25日0—24时,通过口岸联防联控机制,报告1例新增境外输入性新冠肺炎确诊病例。新增治愈...
2021-11-26中国天气网讯 北京今天(11月26日)晴暖延续,最高气温12℃。周末气温略有下降,最高气温8℃至9℃,...
2021-11-26
2021-11-26
2021-11-26
中新网11月26日电 据“徐州发布”微信公众号消息,25日,徐州市疫情防控应急指挥部交通管控组发布...
2021-11-26网上认识的“高富帅”经常嘘寒问暖,关怀备至,以为找到了“白马王子” 武汉一女子就这样被套路...
2021-11-26我们从“失败”“避雷”小组里得到什么 在铺天盖地的网红滤镜美图中,“旅游失败小组”是另类的...
2021-11-26“双11”疯狂剁手是“购物成瘾障碍”吗 “购物成瘾障碍”可不是网购、“双11”火了之后才有的现...
2021-11-26本报记者追踪调查国内多起电信网络诈骗案发现—— 为赚快钱 IT青年沦为新型电诈案“制刀者” ...
2021-11-26记者观察 校园食品安全事件调查,不能是笔“糊涂账” 今年9月,河北霸州市东方金子塔学校部分...
2021-11-26建和谐用工关系 化解年轻人职场“摸鱼”心态 “工作每天都在‘摸鱼’,要不要辞职?”某网络通...
2021-11-26“理财课”变“劫财课” “一元理财训练营”让一些年轻人频频踩坑 “自从学了理财课程,我现...
2021-11-26第三方测评夹杂利益考量 回归公允中立需疏堵结合 第三方测评是一个新兴行业,应该看到它的积极...
2021-11-26Copyright © 2015-2022 纵横水产网版权所有 备案号:浙ICP备2022016517号-12 联系邮箱:51 46 76 11 3 @qq.com