![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
go
学亮编程手记
学亮编程手记
展开
-
go clean -modcache命令清理缓存
这个操作对于解决因为模块缓存导致的问题非常有用,比如当你的依赖库有更新,而你希望确保使用的是最新版本,或者缓存中的模块数据损坏时。不过,由于重新下载所有依赖可能会花费较长时间,因此这只应在确实需要时进行。时,这个命令会删除该目录下的所有内容,迫使Go在下次构建时重新下载所有依赖的模块。之后,Go会开始清理模块缓存,完成后,你在下次执行。等命令时,Go会重新检查并下载必要的模块到缓存中。命令用于清理Go模块的本地缓存。目录下,存储了所有下载和使用的模块版本。原创 2024-05-29 08:51:56 · 535 阅读 · 0 评论 -
golang离线开发:go mod vendor命令的使用
目录包含了项目精确到某一时刻的所有依赖版本,确保了项目在未来任何时候重新构建时,使用的都是与当时一致的依赖版本,从而避免因依赖升级导致的潜在问题。中的依赖进行稳定、一致的构建。同时,一些支持Go模块的构建工具和服务,默认会查找并使用。目录后,即使在没有网络连接的情况下,也可以正常编译和运行项目,因为Go工具链会优先从。是Go语言中用于模块化管理的一个命令,它将当前项目的依赖包复制到项目根目录下的。执行后,所有项目依赖(包括间接依赖)都会被复制到。:当你把所有依赖都放入。原创 2024-04-09 08:54:01 · 671 阅读 · 0 评论 -
golang代码示例:执行shell脚本并获取其输出日志
注意:这个例子假设你的shell脚本在同一目录下,或者在系统的PATH环境变量中定义的路径下。如果不是,请提供完整的脚本路径。在Go语言中,你可以使用"os/exec"包来执行shell脚本并获取其输出。函数会返回命令的标准输出和标准错误的合并输出。如果你希望分别处理标准输出和标准错误,可以使用。同时,确保你的脚本具有执行权限,可以通过。命令来添加执行权限。原创 2024-04-08 22:20:26 · 359 阅读 · 0 评论 -
Golang交叉编译:win11编译Linux二进制可执行程序 set GOOS=linux set GOARCH=amd64
注意: 默认情况下,Go的runtime环境变量CGO_ENABLED=1,即默认开始cgo,允许你在Go代码中调用C代码.如果标准库中是在CGO_ENABLED=1情况下编译的,那么编译出来的最终二进制文件可能是动态链接,所以建议设置 CGO_ENABLED=0以避免移植过程中出现的不必要问题。要在Windows环境下编译出能在Linux环境下运行的Go程序,你需要进行交叉编译。确保你的Windows机器上已经安装了Go,并且版本足够新,能够支持交叉编译。根据你的Linux目标机器,可能需要改变。原创 2024-04-08 21:12:04 · 391 阅读 · 0 评论 -
Golang context代码示例:带取消功能的Context、带超时限制的Context、以及如何在Context中传递自定义值
以下是一些Go语言中context。原创 2024-03-10 22:05:14 · 197 阅读 · 0 评论 -
Golang context的使用场景及与channel的区别
你可以把它想象成一份随请求生命周期流转的“护照”,这份“护照”携带着请求相关的所有重要信息,并且在整个请求处理过程中,任何地方都可以查看这份“护照”以了解请求的状态。简而言之,Context更像是一种全局的通知机制,用于控制整个请求流程的生命周期,而Channel是更为底层的并发通信原语,负责goroutine之间的具体数据交换。函数来通知所有持有该Context的goroutine,它们可以检查Context是否已经取消,从而优雅地停止自己的工作。原创 2024-03-10 22:00:48 · 368 阅读 · 0 评论 -
Golang context介绍及基本使用
包是一个设计用于处理并发任务中控制流和取消信号的核心库。它允许在多个函数和goroutine之间共享请求范围内的状态和取消信号,尤其是在服务器处理HTTP请求、数据库查询或其他涉及异步操作的地方。总结来说,Golang的Context是一个强大的工具,用于管理goroutine间的协作,尤其是取消逻辑和共享请求级别数据,有助于提升程序的健壮性和响应能力。在Go语言(Golang)中,原创 2024-03-10 21:54:43 · 237 阅读 · 0 评论 -
Golang代码示例:使用channel和sync.Mutex确保一组goroutine按顺序执行
在这个示例中,我们创建了一个只包含一个元素的channel(令牌通道)和一个互斥锁。每个goroutine必须先从令牌通道中获取令牌才能开始执行任务,执行完后将令牌放回通道。这种机制确保了只有拿到令牌的goroutine才能执行任务,从而达到顺序执行的目的。注意,实际场景中可能需要采用不同的同步机制来确保main函数不会提前结束,这里仅做示意,没有加入完整的退出逻辑。在Go语言中,我们可以使用channel和sync.Mutex等工具来确保一组goroutine按照预定顺序执行。原创 2024-03-10 15:49:31 · 154 阅读 · 0 评论 -
Golang代码示例:利用channel实现计数器功能,统计完成任务的goroutine数量
来统计完成任务的goroutine数量。每个goroutine在完成任务后向channel发送一个信号(这里统一发送数值1),主线程通过range遍历channel并累加接收到的信号数量,最终得到完成任务的goroutine总数。来等待所有goroutine完成任务,并通过一个channel。在上述代码中,我们使用了。原创 2024-03-10 15:40:24 · 255 阅读 · 0 评论 -
Golang代码示例:在多个goroutine间使用select语句进行通信
语句同时监听两个channel,当任意一个channel准备好接收时,它会立即执行对应的接收操作。同时,我们也添加了一个超时case,防止长时间没有消息时主goroutine陷入死等。在实际项目中,根据需求可能会有不同的逻辑处理。语句用于在多个channel(信道)上等待发送或接收操作,一旦某个channel准备好执行操作,就会执行相应的case分支。原创 2024-03-10 15:37:28 · 200 阅读 · 0 评论 -
Golang channel面试题30道(附答案)
【代码】Golang channel面试题30道(附答案)原创 2024-03-10 15:34:17 · 1498 阅读 · 0 评论 -
Golang csp和gmp的联系与区别
Go语言的运行时环境提供了一个高效的Goroutine调度器(GMP的一部分),它可以将大量的Goroutines映射到少量的操作系统线程上,并通过M:N调度模型来高效利用CPU资源。CSP(Communicating Sequential Processes)和GMP(Goroutine Multiplexing Pattern 或者有时指的是 Golang Scheduler and Process Model)是两个不同的概念,在Go语言中分别代表着不同的层面和技术思想。原创 2024-03-07 01:31:08 · 370 阅读 · 0 评论 -
Golang csp介绍
由于通道的使用,Go 中的并发控制往往是隐式的。:CSP 最关键的组件是 Channels,它是 Go 中实现并发间通信的主要方式。这意味着并发的实体(在 Go 中表现为 Goroutines)不是直接访问共享的数据结构,而是通过发送和接收数据在通道上来交换状态和协调动作,以此避免传统并发编程中常见的竞态条件和死锁问题。总之,Go 语言通过内建支持 CSP 模型,极大地简化了并发编程,鼓励开发者通过明确且易于管理的通信路径来构建复杂的并发系统,从而提高程序的可靠性、可维护性和性能。原创 2024-03-07 01:29:34 · 487 阅读 · 0 评论 -
Golang代码示例:无限循环的两种写法
在Go语言中,for循环有多种形式,这里每个分号(;)分别代表了for循环的三个部分:i := 0,这是循环开始前执行的一次性初始化操作,设置变量i的初始值为0。条件判断表达式:此处为空(;),意味着没有条件检查。因此,循环会一直执行,除非在循环体内遇到break关键字或者程序退出。i++,每次循环迭代后都会执行这一部分。在这里,它是一个自增操作,即每循环一次,变量i的值就会增加1。总结来说,这段代码创建了一个无限循环,其中变量i从0开始并不断递增,在循环体内部可以使用i的当前值进行任何所需的操作。原创 2024-03-06 21:42:26 · 442 阅读 · 0 评论 -
Golang代码示例:只读管道channel
是一个只能接收(receive)整数值的通道(channel)。这种类型的变量只能从通道读取数据,不能向通道写入数据。函数接收一个只能接收整数的通道,并通过遍历这个通道来消费(consume)从其他地方传来的整数任务。通常,这样的变量会在函数签名中用作参数,表示该函数接受一个可以从其中读取整数的通道作为输入。整体含义是声明了一个类型为只能接收(read-only)整数类型的通道的变量。是在Go语言中类型声明的一部分,这里的。是一种特殊的语法,它指定了变量。原创 2024-03-06 21:39:16 · 208 阅读 · 0 评论 -
golang代码示例解释:在使用缓冲channel时,生产者和消费者之间如何通过非阻塞和阻塞的方式来动态调整其执行次序,以及如何实现数据的异步传递。
从日志可以看出生产者和消费者并不是严格按序交替执行的,这体现了Go语言中channel带来的并发特性——生产者和消费者可以异步地执行其操作,且通过channel来协调数据交换。所以,整个日志反映了在使用缓冲channel时,生产者和消费者之间如何通过非阻塞和阻塞的方式来动态调整其执行速度,以及如何实现数据的异步传递。:存在一个容量至少为3的缓冲channel,在没有被显示地关闭之前,可以暂时存放多个值。原创 2024-03-06 21:33:04 · 554 阅读 · 0 评论 -
golang缓冲管道channel应用场景及代码示例
例如,你可以创建一个固定容量的缓冲channel,用于暂存一段时间内产生的事件或数据,消费者goroutine随后处理这些积累的数据。在这段代码中,生产者goroutine连续发送5个整数到容量为3的缓冲channel,前3个数据会被立即放入channel中,之后的第4和第5个数据会使生产者阻塞,直到消费者从channel中取出数据腾出空间。在这个例子中,生产者每秒生成一个任务放到缓冲channel中,消费者每两秒处理一个任务,channel的缓冲能力使得生产者和消费者不必完全同步。原创 2024-03-06 21:22:33 · 304 阅读 · 0 评论 -
golang无缓冲管道channel应用场景及代码示例
当需要两个goroutine严格按顺序执行,确保一个goroutine发送的数据在另一个goroutine准备接收之前不会丢失,无缓冲channel是非常适合的选择。通过无缓冲channel,可以实现一组goroutine的同步启动,每个goroutine在开始工作之前先从channel接收一个信号,从而保证所有goroutine同时开始工作。在这个例子中,无缓冲的channel被用作一个简单的信号通道,当main goroutine决定结束子goroutine的工作时,通过关闭channel发出信号。原创 2024-03-06 21:17:16 · 421 阅读 · 0 评论 -
Go语言(Golang)代码示例:获取HTTP请求客户端的IP地址
在Go语言(Golang)中,获取HTTP请求客户端的IP地址通常发生在HTTP服务器处理请求的过程中。请注意,由于代理服务器的存在,直接从获取到的可能是代理服务器的IP地址,而非最终客户端的IP地址。头信息是由代理服务器添加的,用于传递客户端IP地址。在实际应用中,特别是在云端环境或使用了负载均衡器的情况下,通常需要信任上游代理并解析这个头信息以获取客户端真实IP。另外,由于头可能包含多个IP(从客户端到服务器的所有跳转IP),所以通常取第一个IP作为客户端IP。原创 2024-02-28 19:24:56 · 749 阅读 · 0 评论 -
Golang代码示例:模拟ssh远程登录目标服务器执行shell脚本(仅可用于教学用途)
使用Go语言实现以下功能:监听9999端口,只能允许客户端192.168.100.98可发起get请求,并且携带一个名为type的字符串,当调用9999端口时,会根据type的取值在当前服务器执行相应的shell脚本。原创 2024-02-27 18:58:13 · 569 阅读 · 0 评论 -
Golang代码示例:监听本地9999端口并接收从命令行发送的数据
当你在命令行中输入内容并按回车后,服务端程序将会打印出接收到的内容。要发送数据到这个程序,你可以在命令行中使用。原创 2024-02-25 17:01:40 · 295 阅读 · 0 评论 -
Golang命令行解析工具:urfave代码示例
【代码】Golang命令行解析工具:urfave代码示例。原创 2023-11-11 23:41:30 · 75 阅读 · 0 评论 -
Golang标准库:bufio包 — 缓存IO
bufio 包实现了缓存IO。它包装了 io.Reader 和 io.Writer 对象,创建了另外的Reader和Writer对象,它们也实现了 io.Reader 和 io.Writer 接口,不过它们是有缓存的。该包同时为文本I/O提供了一些便利操作。bufio.Reader 结构包装了一个 io.Reader 对象,提供缓存功能,同时实现了 io.Reader 接口。Reader 结构没有任何导出的字段,结构定义如下:1.4.1.1 实例化bufio 包提供了两个实例化 bufio.Reader原创 2023-11-11 23:33:42 · 295 阅读 · 0 评论 -
Golang标准库:fmt包 — 格式化IO
fmt 包实现了格式化I/O函数,类似于C的 printf 和 scanf. 格式“占位符”衍生自C,但比C更简单。fmt 包的官方文档对 Printing 和 Scanning 有很详细的说明。这里就直接引用文档进行说明,同时附上额外的说明或例子,之后再介绍具体的函数使用。原创 2023-11-11 23:32:45 · 187 阅读 · 0 评论 -
Golang标准库:ioutil包 — 方便的IO操作函数集
虽然 io 包提供了不少类型、方法和函数,但有时候使用起来不是那么方便。比如读取一个文件中的所有内容。为此,标准库中提供了一些常用、方便的IO操作函数。说明:这些函数使用都相对简单,一般就不举例子了。原创 2023-11-11 23:31:45 · 153 阅读 · 0 评论 -
Golang标准库:io包 — 基本的 IO 接口
io 包为 I/O 原语提供了基本的接口。它主要包装了这些原语的已有实现。由于这些被接口包装的I/O原语是由不同的低级操作实现,因此,在另有声明之前不该假定它们的并发执行是安全的。在 io 包中最重要的是两个接口:Reader 和 Writer 接口。本章所提到的各种 IO 包,都跟这两个接口有关,也就是说,只要满足这两个接口,它就可以使用 IO 包的功能。原创 2023-11-11 23:30:52 · 169 阅读 · 0 评论 -
Golang标准库:unicode包 — Unicode 码点、UTF-8/16 编码
世界中的字符有许许多多,有英文,中文,韩文等。随着全球化进程不断深入,我们强烈需要一个能够容纳世界上所有字符的字符集,方便编码为计算机能处理的二进制数。每个字符都给予一个独一无二的编号,就不会出现写文字的人和阅读文字的人使用不同的编码而出现乱码现象。于是 Unicode 就出现了,它将所有的字符用一个唯一的数字表示。最开始的时候,unicode 认为使用两个字节,也就是 16 位就能包含所有的字符了。原创 2023-11-11 23:24:26 · 657 阅读 · 0 评论 -
Golang标准库:regexp包 — 正则表达式
包的正则表达式实现保证运行时间随着输入大小线性增长的(即复杂度为 O(n),其中 n 为输入的长度),这一点,很多正则表达式的开源实现无法保证,参见:RSC 的。正则表达式为文本处理提供了强大的功能。Go 作为一门通用语言,自然提供了对正则表达式的支持。正则表达式采用 RE2 语法(除了 \c、\C),和 Perl、Python 等语言的正则基本一致。Regexp 类型提供了多达 16 个方法,用于匹配正则表达式并获取匹配的结果。另外,所有的字符都被视为 utf-8 编码的码值 (Code Point)。原创 2023-11-11 23:23:10 · 80 阅读 · 0 评论 -
Golang标准库:strconv包 — 字符串和基本数据类型之间转换
这里的基本数据类型包括:布尔、整型(包括有 / 无符号、二进制、八进制、十进制和十六进制)和浮点型等。原创 2023-11-11 23:21:51 · 191 阅读 · 0 评论 -
Golang标准库:bytes包 — byte slice 字节数组便利操作
该包定义了一些操作 byte slice 的便利操作。因为字符串可以表示为 []byte,因此,bytes 包定义的函数、方法等和 strings 包很类似,所以讲解时会和 strings 包类似甚至可以直接参考。说明:为了方便,会称呼 []byte 为 字节数组。原创 2023-11-11 23:20:31 · 305 阅读 · 0 评论 -
Golang标准库:strings包 — 字符串操作
前面已经说过,由于 string 类型可以看成是一种特殊的 slice 类型,因此获取长度可以用内置的函数 len;同时支持 切片 操作,因此,子串获取很容易。其他的字符串常见操作就是我们这小节要介绍的,由于这些操作函数的使用比较简单,只会对某些函数举例说明;但会深入这些函数的内部实现,更好的掌握它们。说明:这里说的字符,指得是 rune 类型,即一个 UTF-8 字符(Unicode 代码点)。原创 2023-11-11 23:16:38 · 341 阅读 · 0 评论 -
Golang标准库:sort包—— 排序算法
该包实现了四种基本排序算法:插入排序、归并排序、堆排序和快速排序。但是这四种排序方法是不公开的,它们只被用于 sort 包内部使用。所以在对数据集合排序时不必考虑应当选择哪一种排序方法,只要实现了 sort.Interface 定义的三个方法:获取数据集合长度的 Len() 方法、比较两个元素大小的 Less() 方法和交换两个元素位置的 Swap() 方法,就可以顺利对数据集合进行排序。sort 包会根据实际数据自动选择高效的排序算法。原创 2023-11-11 23:12:46 · 460 阅读 · 0 评论 -
Golang标准库:Timer定时器相关函数或方法的使用
定时器是进程规划自己在未来某一时刻接获通知的一种机制。Timer(到达指定时间触发且只触发一次)和Ticker(间隔特定时间触发)。原创 2023-11-11 23:06:47 · 76 阅读 · 0 评论 -
Golang标准库:Time 类型详解
这个字符串了。没错,这是固定写法,类似于其他语言中等。为什么采用这种形式?又为什么是这个时间点而不是其他时间点?官方说,使用具体的时间,比使用更容易理解和记忆;这么一说还真是 ~,另一种形式,对应是 1、2、3、4、5、6、7;,很好记:2006 年 1 月 2 日 3 点 4 分 5 秒 ~如果你是 PHPer,喜欢 PHP 的格式,可以试试times这个包。原创 2023-11-11 23:05:26 · 577 阅读 · 0 评论 -
Golang标准库:time包时区相关
通常,我们使用time.Local即可,偶尔可能会需要使用UTC。在解析时间时,心中一定记得有时区这么回事。当你发现时间出现莫名的情况时,很可能是因为时区的问题,特别是当时间相差 8 小时时。原创 2023-11-11 23:03:53 · 490 阅读 · 0 评论 -
Golang标准库:time包主要类概述
time 包提供了时间的显示和计量用的功能。日历的计算采用的是公历。原创 2023-11-11 23:00:45 · 35 阅读 · 0 评论 -
Golang标准库:syscall包代码示例
函数将返回三个值,我们在这个示例中忽略了前两个返回值。如果调用出现错误,返回值将为非零值,并将错误信息存储在最后一个返回值中。最后两个参数为 0,表示我们不需要传递任何额外的参数给系统调用。包需要小心,因为它直接与底层操作系统交互,并涉及系统特定的调用和数据结构。包时,您需要了解目标操作系统的系统调用接口,并谨慎处理返回值和错误处理。系统调用,它用于获取当前的时间信息。函数调用了底层的系统调用。在这个示例中,我们调用了。,它用于存储获取到的时间。最后,我们输出获取到的时间信息。在这个示例中,我们导入了。原创 2023-11-11 22:53:23 · 253 阅读 · 0 评论 -
Golang标准库:math — 基本数学函数
math 包实现的就是数学函数计算。原创 2023-11-11 21:11:47 · 256 阅读 · 0 评论 -
Golang标准库:io/fs — 抽象文件系统
Go 语言从 1.16 开始增加了 io/fs 包,该包定义了一个文件系统需要的相关基础接口,因此我们称之为抽象文件系统。该文件系统是层级文件系统或叫树形文件系统,Unix 文件系统就是这种类型。本节除了讲解标准库的相关内容,还会实现一个文件系统作为例子。注意,因为抽象了一个文件系统,之前 os 包中和文件系统相关的功能都移到 io/fs 包了,os 中的原类型只是 io/fs 对应类型的别名。如果你的系统要求 Go1.16,应该优先使用 io/fs 包。原创 2023-11-11 21:10:58 · 249 阅读 · 0 评论 -
Golang标准库:path/filepath — 兼容操作系统的文件路径操作
包涉及到路径操作时,路径分隔符使用。不同系统,路径表示方式有所不同,比如 Unix 和 Windows 差别很大。本包能够处理所有的文件路径,不管是什么系统。注意,路径操作函数并不会校验路径是否真实存在。原创 2023-11-11 21:09:58 · 502 阅读 · 0 评论