【Golang】编程问题报错解决记录

记录一些 Golang 编程中的报错处理。

IDEA报错: 无法在构建后运行 ‘main’ 文件具有非 main 软件包或不包含 ‘main’ 函数(main包)

错误截图和代码

错误截图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xKKhypux-1639278226140)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211212105820707.png)]

对应代码:package Go_in_action

成功处理:修改为 package main

原理和结论

原理: 引用《Go in action》

第二章简单描述: main()函数保存在名为 main 的包里。如果 main 函数不在 main 包里,构建工具就不会生成可执行文件。

3.1.2 - main包: 在 Go 语言里,命名为 main 的包具有特殊的含义。(根据个人理解分点说明且添加小标题)

  • 编译可执行文件必备的包:Go 语言的编译程序会试图把 main 的包编译成二进制可执行文件。因此所有用Go语言编译的可执行程序,都必须有一个名叫main的包
  • 编译可执行文件必备的函数:当编译器发现某个包的名字为 main 时,它必须发现名为 main() 的函数,否则不会创建可执行文件。(因为main()函数是程序的入口,没有这个函数,程序就无法开始执行)
  • 可执行文件的命名:程序编译时,会使用声明 main 包的代码所在目录的 目录名 作为二进制可执行文件的文件名。

结论:

  • 入口函数所在的文件,必须声明 main 包,否则无法编译二进制可执行程序
  • 二进制可执行程序命名,是声明 main 包代码所在目录的 目录名

同级目录引用其他文件内容

@Date:2022-04-05

Crawlergo项目中,Crawlergo/cmd/crawlergo/crawlergo_cmd.go 通过 "crawlergo/pkg/config" 引用某个目录。

在 crawlergo_cmd.go 同级目录下创建 paramsFuzz.go,由于想和 crawlergo_cmd.go 的数据结构保持一致,计划引用该文件中的结构体。

引用报错:undefined

// 按照其他引用写法,使用如下路径引用	
// 报错:编译过程中会自动删除该行代码,然后变量就会报错 undefined
import("crawlergo/cmd/crawlergo/crawlergo_cmd")

编辑运行配置,发现

  • 工作目录:是项目根目录 crawlergo-0.4.2
  • 运行种类:文件

引用报错:import cycle not allowed

修改 运行 种类为目录,引用路径不变,此时 IDEA 可以看到找到了 crawlergo.Request 结构体,应该可以运行。运行时报错如下:

// 报错:import cycle not allowed
import("crawlergo/cmd/crawlergo/crawlergo_cmd")

参考文章

在使用import导入相应的包时,你可能会碰到 import cycle not allowed 这样的问题,出现这样的问题是你的包没有规划好,导致包相互依赖。

这种相互依赖可以通过将方法拆分到另一个包的方式来解决。

解决方式:其实考虑到了包依赖的问题,把结构体 crawlergo.Request 复制过来一份就行了。

内存泄露错误:ioutil.ReadAll(resp.Body)(数组为空导致的报错)

date:2022年4月

报错代码:body, err := ioutil.ReadAll(resp.Body)
报错信息:panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x40 pc=0xf68225]

在这里插入图片描述

参考文章

报错原因:response body 需要关闭,否则可能会造成内存泄露。
~尝试解决:定义变量接收 response body 的内容,然后释放 response body 。~

body, err := ioutil.ReadAll(resp.Body)

			respText := string(body)
			err = resp.Body.Close()
			if err != nil {
				return
			}

~经过一次测试,没有报错。后续运行时又报出相同的错误,但也没有使用并发机制,应该不存在异步导致的资源未关闭。~

~更改为 defer 代码,仍然报错,推测不是因为 body 没有关闭的原因。~
参考文章:Go语言中defer的一些坑
~尝试解决:把 defer 删除,还是报错。~

			body, err := ioutil.ReadAll(resp.Body)
			if err != nil {
				return
			}
			//body, err := ioutil.ReadAll(resp.Body)

			respText := string(body)

			resp.Body.Close()

~怎么改都还是报错 panic: runtime error: invalid memory address or nil pointer dereference。
推测那就是代码的问题了,go语言http请求(一) 的代码不能支持大批量的http请求。~

打印了参数构造前后的信息,发现如果以 ? 来提取参数,有时会遇到 http://127.0.0.1/DVWA-master/index.php? 这样的 URL,此时参数数组是空数组,遍历空数组导致报错。

文章来源------区块链市场观察家

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇