
go
Python ml
这个作者很懒,什么都没留下…
展开
-
go协程交替打印1-100
【代码】go协程交替打印1-100。原创 2024-05-20 16:12:31 · 213 阅读 · 0 评论 -
goroutine池的实现
goroutine池实现原创 2024-05-20 11:35:15 · 223 阅读 · 0 评论 -
Gin中间件函数原理
在Gin框架中,当我们讨论中间件或处理函数时,这些函数通常直接定义为符合 gin.HandlerFunc 类型的函数,或者是返回 gin.HandlerFunc 类型的函数(工厂函数)。让我们来详细解释这两种情况下 c.handlers[c.index] 的行为和执行逻辑。直接定义为 gin.HandlerFuncc.Next()这种情况下,c.handlers 数组直接包含了这些中间件和处理函数的引用。原创 2024-04-14 15:18:15 · 1098 阅读 · 0 评论 -
Gin 相对 标准库 net/http的优势
要用标准库 net/http 来实现类似于上述Gin示例代码的功能,代码会稍微复杂一些,因为 net/http 不直接支持像Gin那样的参数化路由和中间件。)定义一个GET请求的路由,其中:id是一个参数占位符,可以通过c.Param(“id”)直接获取该参数。Gin允许开发者使用简洁的API来定义路由,支持路由分组和中间件,这使得构建具有复杂路由规则的大型应用变得更加简单和高效。使用router.Group(“/api”)创建路由分组,可以将相关的路由组织在一起,使得路由管理更加模块化。原创 2024-04-11 20:59:32 · 787 阅读 · 1 评论 -
go root和go path
在 Go 1.11 版本之后,Go Modules 的引入使得 GOPATH 不再是必须的,可以在不设置 GOPATH 的情况下进行项目开发。在 GOROOT 下通常包含 bin、pkg、src 等目录,其中 bin 存放了 Go 的可执行文件,pkg 存放了标准库的包对象文件,src 存放了 Go 的标准库源代码。在 Go 语言中,GOPATH 和 GOROOT 是两个重要的环境变量,它们分别用于指定工作区和 Go 的安装路径。GOPATH 是用于指定工作区的环境变量,用于存放你自己的 Go 项目代码。原创 2024-04-03 12:03:18 · 619 阅读 · 0 评论 -
GIN实例讲解
在匿名函数中,通过 c.Query(“name”) 方法获取查询参数中的 name 参数值,如果未提供则默认为 “Guest”。使用 r.GET() 方法定义一个 GET 请求的路由,当访问 /hello 路径时执行匿名函数。使用 r.Run() 方法启动 Gin 应用,默认监听在 0.0.0.0:8080 地址。导入 github.com/gin-gonic/gin 包,引入 Gin 框架。使用 c.String() 方法向客户端返回一个字符串响应,包含个性化的问候语。原创 2024-04-02 22:09:49 · 968 阅读 · 0 评论 -
sync包常用并发安全数据结构
在这个示例中,我们使用atomic.AddInt32来确保对counter变量的增加操作是原子的,即使在并发环境下也能保证数据的一致性和完整性。原创 2024-03-29 13:06:03 · 321 阅读 · 0 评论 -
go中的context超时控制、超时传递、跨进程超时传递
WithCancel、WithDeadline和WithTimeout是context包中非常重要的函数,它们允许开发者基于取消信号、截止时间和超时控制goroutine的行为。context包中的WithCancel、WithDeadline和WithTimeout函数提供了创建上下文(context)对象的能力,这些上下文对象对于管理goroutine的生命周期非常重要,尤其是在处理取消、超时和截止时间的场景中。WithDeadline用于创建具有明确截止时间的上下文。这适用于需要限制执行时间的任务。原创 2024-03-28 22:52:53 · 1332 阅读 · 0 评论 -
Channel 阻塞机制、死锁问题
所有goroutine都在等待,而没有其他goroutine向channel发送数据:比如,在所有工作goroutine完成工作后,如果主goroutine也在等待从某个channel接收数据,而没有其他goroutine会向这个channel发送数据,这会导致程序死锁。channel的阻塞机制确保了数据的同步传输,这意味着在某些情况下,操作channel的goroutine可能会被挂起(阻塞),直到另一个goroutine准备好进行接收或发送操作。Channel 阻塞机制。原创 2024-03-28 22:09:38 · 395 阅读 · 0 评论 -
Channel 结合 Select 使用
当select中的一个channel准备就绪,即可以进行非阻塞的发送或接收操作时,select就会执行该操作,并执行相应的case分支。select会阻塞,直到其中一个channel操作可以继续,即一个case分支准备就绪,然后执行该分支。同时处理多个channel: 当你有多个channel需要处理时,select可以让你的goroutine同时等待这些channel上的发送或接收操作。实现超时: 通过select结合time.After函数,可以给channel操作设置超时,防止永久阻塞。原创 2024-03-28 22:08:46 · 387 阅读 · 0 评论 -
接口的高内聚低耦合
假设我们正在开发一个日志系统,该系统需要支持多种日志输出方式,比如控制台输出、文件输出等。我们可以定义一个Logger接口,然后为每种日志输出方式实现这个接口。同时,由于我们依赖于Logger接口而不是具体的实现,系统的各部分之间耦合度低,我们可以轻松地添加新的日志输出方式,而不需要修改使用日志的代码。在这个例子中,Logger接口使得我们的日志系统具有高内聚的特点:所有日志输出的实现都遵循同一个接口定义。原创 2024-03-28 21:31:42 · 201 阅读 · 0 评论 -
go中方法的Receiver (值类型&指针类型)
在Go语言中,当使用值类型接收者定义方法时,即使是结构体这样的较大对象,也是以值传递的形式调用的,接收者在方法调用过程中被复制。在Go中,使用指针类型接收者定义方法时,是以指针传递的方式调用的,接收者是指向原始变量的指针。方法的接收者可以是值类型也可以是指针类型,这决定了调用方法时是如何传递接收者的。当你需要在方法中修改接收者指向的数据,或者接收者是一个大结构体时,使用指针类型接收者更为合适,因为这避免了不必要的数据复制。当方法的接收者是指针类型时,调用方法时使用的是指向接收者的指针。原创 2024-03-28 17:28:40 · 738 阅读 · 0 评论 -
go中继承、多态的模拟实现
在这个例子中,Human和Parrot都实现了Talker接口的Talk方法,尽管它们的实现不同。Communicate函数接受一个Talker类型的参数,展示了如何使用接口来实现多态:它可以接受任何实现了Talker接口的类型的实例。在Go中,接口是一种类型,定义了一组方法签名,但不实现这些方法。一个结构体如果实现了接口的所有方法,则被认为实现了该接口。它通过接口(Interfaces)、结构体(Structs)和组合(Composition)提供了继承和多态的能力。继承的模拟实现:结构体嵌套。原创 2024-03-28 17:06:54 · 739 阅读 · 0 评论 -
go中函数与方法的区别与go中关于面向对象理解
方法是绑定到特定类型的,这意味着方法的作用范围受到接收者类型的限制。只有该类型的实例才能调用这个方法。这使得方法可以用来实现与特定类型相关的操作和行为,实现了更好的封装和面向对象的设计。方法是附加到特定类型上的函数,这个特定类型称为方法的接收者。在这个例子中,myInt是MyInt类型的实例,我们通过myInt来调用它的Add方法。在这个例子中,Add是MyInt类型的一个方法,它的接收者是MyInt类型的变量。方法的调用需要通过特定的类型实例来调用,这个实例称为方法的接收者。原创 2024-03-28 16:43:11 · 556 阅读 · 0 评论 -
常见panic场景 (空指针、越界、断言、map相关panic)
在Go语言中,panic是一个内建函数,用于在遇到无法继续执行的错误条件时中断当前函数的执行。panic可以由开发者显式调用,也可能由运行时错误触发。通过这些做法可以提高程序的健壮性,避免不必要的panic导致的程序崩溃。进行类型断言时,优先使用“comma-ok”模式。访问数组或切片时,确保索引在有效范围内。检查指针是否为nil之前再解引用。使用映射前确保已经正确初始化。原创 2024-03-28 16:03:42 · 368 阅读 · 0 评论 -
recover 的使用
recover原创 2024-03-28 15:58:43 · 169 阅读 · 0 评论 -
go中匿名函数的使用
这可以使得函数本地变量的生命周期超出函数执行的范围,直至没有任何闭包再引用这些变量时,这些变量的内存才会被释放。匿名函数可以在函数内部定义并使用,这使得它们非常适合实现局部辅助函数的功能,例如在需要递归调用的场景下。返回一个匿名函数并使用闭包是Go语言中处理状态封装、延迟执行和函数定制化的强大工具,返回匿名函数的场景主要涉及到闭包的使用。这里,counter函数返回一个匿名函数,该匿名函数每次被调用时都会增加count的值,而count变量对外部是隐藏的。Go中的函数定义都必须在包级别进行。原创 2024-03-28 14:34:43 · 577 阅读 · 0 评论 -
go中引用类型的空指针、野指针问题
然而,在使用unsafe包进行指针运算或与C语言交互(通过cgo)时,仍然可能遇到野指针的问题。因此,在使用unsafe包或进行指针算术时,程序员需要格外小心,确保指针指向的是有效和预期的内存地址。在Go语言中,引用类型(如指针、切片、映射、通道、接口等)的使用为数据操作提供了灵活性,但同时也引入了空指针和野指针的概念。通过遵循这些最佳实践,你可以减少在Go程序中遇到空指针和野指针相关错误的风险,写出更加安全和可靠的代码。避免空指针的最佳实践是在使用指针之前检查它是否为nil,或确保它已经被正确初始化。原创 2024-03-28 13:19:40 · 778 阅读 · 0 评论 -
go中结构体标签:omitempty、json꞉“name“、 gorm꞉“column꞉name“、yaml꞉“name“
在Go语言中,结构体标签(Struct Tags)提供了一种在编译时附加到结构体字段上的元数据,这些标签可以被运行时的反射(reflection)机制读取。这些信息可以被各种库和框架用来实现序列化、反序列化、数据库映射、配置解析、数据验证等功能,使得结构体的使用更加灵活和强大。标签的使用大大增强了Go语言在数据处理和元数据管理方面的能力,同时保持了代码的简洁性和易读性。结构体标签允许你在不修改原有数据结构的情况下,为字段附加额外的信息或元数据。原创 2024-03-28 12:38:08 · 819 阅读 · 0 评论 -
go中结构体指针操作
虽然item1是指针,但是使用时不用*item1,这算是go中的语法糖。原创 2024-03-28 12:30:29 · 365 阅读 · 0 评论 -
84. 柱状图中最大的矩形
【代码】84. 柱状图中最大的矩形。原创 2024-02-02 15:06:07 · 143 阅读 · 0 评论