![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
go
文章平均质量分 57
liulanba
这个作者很懒,什么都没留下…
展开
-
go处理json
在 Go 中,你可以使用内置的 encoding/json 包来处理 JSON 格式数据。该包提供了函数和类型,使你能够将 JSON 数据解析为 Go 对象(反序列化)或将 Go 对象转换为 JSON 数据(序列化)。原创 2024-04-18 11:54:23 · 608 阅读 · 0 评论 -
grpc的设计和实现浅析
gRPC(gRPC Remote Procedure Call)是一个开源的高性能 RPC(远程过程调用)框架,由Google开发,支持多种编程语言。gRPC 基于 Protocol Buffers(ProtoBuf)序列化协议,使用 HTTP/2 作为传输协议,具有诸多优势,如高效性、多语言支持、IDL(Interface Definition Language)定义服务接口等。原创 2023-12-20 23:46:40 · 990 阅读 · 0 评论 -
go开发--操作mysql数据库
在 Go 中访问 MySQL 数据库并进行读写操作通常需要使用第三方的 MySQL 驱动。Go 中常用的 MySQL 驱动有和等。原创 2023-12-20 18:30:03 · 497 阅读 · 1 评论 -
浅谈go的死锁问题
在Go语言中,死锁(Deadlock)是指一组goroutines相互等待对方完成,导致程序无法继续执行的状态。在使用goroutines和channels时,死锁是比较容易发生的问题。通过这些方法,可以有效地避免在使用goroutines和channels时出现死锁问题。保持发送和接收操作成对出现、使用select语句、使用同步工具等都是有效的防范措施。使用select语句: select语句可以用于处理多个channel的操作,避免死锁。原创 2023-05-09 16:27:50 · 2244 阅读 · 0 评论 -
go-反射
反射的主要作用是在程序运行时动态地获取类型信息和操作对象的属性和方法,这样就可以在不知道具体类型的情况下对对象进行操作。通过reflect包中的ValueOf函数获取到的值信息是只读的,不能直接修改。使用 reflect.ValueOf 获取一个值的反射对象,然后使用 MethodByName 方法获取方法的反射对象,并通过 Call 方法调用方法。反射是指在程序运行时动态获取程序的类型信息和操作对象的属性和方法的能力。在Go语言中,反射的基本操作包括获取类型信息、获取值信息、设置值信息和调用方法等。原创 2023-10-31 12:14:22 · 243 阅读 · 0 评论 -
go-值赋值和引用赋值
通过 copy 函数将 ls 的元素复制到 lk,并修改了 lk[1] 的值,这个修改只会影响到 lk 自身,不会影响 ls。修改目标切片 lk 中的元素值不会影响原始切片 ls,因为它们引用的是不同的内存空间。当对 p1 的字段进行修改时,p3 不会受到影响,因为它们引用的是不同的内存地址。这意味着目标变量和源变量是完全独立的,它们引用的是不同的内存地址。修改目标变量的值不会影响源变量的值。当进行引用赋值时,目标变量和源变量引用的是相同的底层数据。需要注意的是,值赋值和引用赋值的行为取决于变量的类型。原创 2023-10-30 19:50:34 · 369 阅读 · 0 评论 -
Go实现网络通信
Go 语言提供了强大的网络编程能力,包括 TCP、UDP、HTTP、WebSocket 等协议的支持。原创 2023-10-26 16:41:18 · 488 阅读 · 0 评论 -
go实现文件的读写
如果想要覆盖文件中的内容并写入新的数据,可以使用 os.OpenFile 函数以写入模式打开文件,并使用 Write 方法写入数据。如果想要在文件末尾追加新的数据,可以使用 os.OpenFile 函数以追加模式打开文件,并使用 Write 方法写入数据。使用 os.Open 函数打开文件并返回一个文件对象,然后使用 bufio.Reader 对象逐行读取文件内容。使用 os.Open 函数打开文件并返回一个文件对象,然后使用 io.Read 接口的实现来读取文件内容。然后,我们使用返回的文件对象的。原创 2023-10-25 14:45:03 · 476 阅读 · 0 评论 -
Golang开发--sync.WaitGroup
通过这种方式,我们可以实现等待所有 goroutine 完成的效果:每个 goroutine 在完成任务后调用 Done 方法,计数器 counter 减少,直到最后一个 goroutine 完成任务并将计数器减少到零,从而释放阻塞在原创 2023-09-25 13:05:41 · 277 阅读 · 0 评论 -
Golang开发--互斥锁和读写锁
在使用互斥锁时,需要确保在访问共享资源之前获取锁,在使用完毕之后释放锁。当对共享数据进行频繁的读操作时,可以使用读写锁来允许多个并发的读操作,而不会阻塞彼此。互斥锁是一种独占锁,意味着只有一个 goroutine 可以获取到锁并执行临界区代码,其他 goroutine 需要等待锁的释放。读写锁提供了一种有效的并发控制机制,使得多个读操作和写操作可以在一定程度上同时进行,以提高程序的性能。需要注意的是,读写锁应该被谨慎使用,只有在确实需要对共享数据进行读写控制时才使用。多个读操作可以同时进行,互不干扰。原创 2023-09-25 13:02:21 · 234 阅读 · 0 评论 -
Golang开发--defer关键字
defer 语句中的函数参数会在 defer 语句执行时求值,而不是在函数返回时求值。这意味着,如果 defer 语句中的函数调用有参数,参数的值在 defer 语句执行时就会被确定。"是先输出的,而defer语句中的函数调用是在main函数返回之前执行的,且按照声明顺序的相反顺序执行。defer语句中的函数或方法调用可以包含参数,这些参数会在defer语句执行时被计算并保存,但实际调用时会使用当前的参数值。在函数中使用defer语句时,需要在调用函数或方法的语句前面加上defer关键字。原创 2023-09-21 16:11:36 · 222 阅读 · 0 评论 -
Golang开发--计时器(Timer)和定时器(Ticker)
创建定时器:使用time.NewTicker(duration)函数创建一个定时器,其中duration是一个time.Duration类型的时间段,表示定时器触发的时间间隔。创建计时器:使用time.NewTimer(duration)函数创建一个计时器,其中duration是一个time.Duration类型的时间段,表示计时器触发的时间间隔。计时器允许你在指定的时间间隔后执行某个操作。等待计时器触发:使用原创 2023-09-14 17:24:15 · 2255 阅读 · 0 评论 -
Golang开发--select
需要注意的是,由于通道操作可能会阻塞,如果没有对应的接收方来接收发送的值,或者通道已满(对于无缓冲通道),发送操作将会阻塞。根据发送数据的时间,select语句会选择其中一个就绪的case块进行执行。在这个示例中,ch1通道的数据将在2秒后就绪,而ch2通道的数据将在3秒后就绪。如果没有任何case中的操作就绪,并且没有default块,则select语句将阻塞,直到至少有一个case中的操作就绪。这取决于通道操作的就绪顺序,如果两个通道都在4秒内就绪,那么select语句会随机选择一个就绪的操作执行。原创 2023-09-11 19:13:49 · 1760 阅读 · 0 评论 -
Golang开发-new和make关键字的区别
输出结果显示,p指向一个新的Person对象,其中Name字段为空字符串,Age字段为零值(int类型的零值为0)。在Go语言中,new关键字用于创建一个新的零值对象,并返回指向该对象的指针。new关键字返回的指针可以直接使用,而make关键字返回的已初始化数据结构可以直接操作。make关键字用于创建并初始化切片、映射和通道类型的数据结构,仅适用于特定的引用类型。使用new关键字返回的是指针,使用make关键字返回的是已初始化的数据结构。其中,Type表示要创建的对象的类型,ptr是指向新对象的指针。原创 2023-09-11 17:15:50 · 1657 阅读 · 0 评论 -
Golang开发--interface的使用
在此示例中,我们首先定义了一个名为 Shape 的接口,它包含了一个 Area 方法,该方法返回 float64 类型的面积。接口为实现多态性提供了一种机制,允许不同的数据类型实现相同的方法,从而可以以统一的方式处理这些不同类型的对象。这个示例演示了接口的多态性,不同类型的对象可以通过相同的接口进行操作,从而使代码更加灵活和可扩展。在Go中,可以创建接口类型的变量,并将实现了接口的类型的值分配给这些变量。Go允许将多个接口组合成一个接口。这样,一个类型只需实现组合接口中的所有方法,就被视为实现了组合接口。原创 2023-09-07 23:34:16 · 1927 阅读 · 0 评论 -
Golang开发--Goroutine的使用
同时,Go 语言的运行时系统会在多个物理线程上调度 Goroutine,实现并行执行,以充分利用多核处理器的性能。它使得开发人员能够更轻松地实现并发、并行和多任务处理,从而充分利用多核处理器的性能,并提高程序的响应性和吞吐量。它可以同时监听多个通道的发送和接收操作,当其中任意一个操作准备就绪时,select 语句将执行相应的操作。通道的发送和接收操作在不同 Goroutine 之间提供了隐式的同步,避免了竞态条件和数据竞争。原子操作可以保证在并发环境中对共享变量的读取和写入是原子性的,不会被中断。原创 2023-09-07 15:11:33 · 1790 阅读 · 0 评论 -
Golang开发--channel的使用
在 Go 语言中,channel(通道)是一种用于在 goroutine 之间进行通信和同步的并发原语。它提供了一种安全且简单的方式来传递数据。原创 2023-09-07 15:04:21 · 1833 阅读 · 0 评论 -
go的make使用
在 Go 语言中,make 是一个用于创建切片、映射(map)和通道(channel)的内建函数。2.make 函数返回的是已经初始化的数据结构(切片、映射或通道),因此您可以直接开始使用它们。make 可以用于创建切片,指定切片的类型、长度和容量。切片的容量可以选择性地指定,如果未指定容量,则默认与长度相同。1.使用 make 函数创建切片、映射和通道时,都会分配相应类型的内存,确保了这些数据结构的正确初始化。3.对于切片和映射,如果不指定容量,容量会与长度相同。原创 2023-08-09 13:09:34 · 2938 阅读 · 0 评论 -
go的type关键字
在 Go 语言中,reflect 包提供了更详细的反射机制,可以用于获取变量的类型、值等更多信息。在 Go 语言中,type 关键字用于定义自定义数据类型(类型别名、结构体、接口等),以及获取某个变量的类型信息。在上面的示例中,通过 shape.(type) 进行类型选择,判断具体是哪种类型的形状,并分别调用其 Area() 方法。在上面的示例中,使用 s.(Shape) 进行类型断言,判断变量 s 是否实现了 Shape 接口。在 Go 语言中,自定义类型的零值是该类型的初始值。原创 2023-08-09 13:00:10 · 2614 阅读 · 0 评论 -
fmt的格式化输入输出
fmt 包是 Go 语言标准库中用于格式化输入和输出的包,它提供了丰富的函数来控制输出的格式,处理不同类型的数据,并且可以从输入源(如标准输入、文件)读取数据。这只是 fmt 包的一些用法示例,它提供了更多功能来处理格式化输出和输入。您可以参考 Go 官方文档中的 fmt 包文档以获取更详细的信息:https://pkg.go.dev/fmt。格式字符串中使用 % 符号来表示要插入的值的类型,并可以添加额外的标志来控制输出的方式。使用不同的 Scan 函数来读取不同类型的数据。原创 2023-08-09 12:55:50 · 2562 阅读 · 0 评论 -
go的strings用法
上面示例中展示了 strings 包中的一些常用函数,当然还有其他更多函数可以满足不同的字符串处理需求。如果想要了解更多函数和用法,可以查阅 Go 官方文档中的 strings 包文档:https://pkg.go.dev/strings。strings 是 Go 语言标准库中提供的一个包,用于处理字符串相关的操作。这个包包含了许多函数,可以用于字符串的切割、拼接、替换、查找等操作。原创 2023-08-09 12:48:53 · 2570 阅读 · 0 评论 -
go的strconv的用法详解
strconv 是 Go 语言标准库中的一个包,用于在基本数据类型(例如整型、浮点型)和字符串之间进行转换。这个包提供了多个函数,用于将不同类型的数据转换为字符串,以及将字符串转换为不同类型的数据。在上述示例中,我们展示了 strconv 包中的一些常用函数,这些函数用于将整型、浮点型、布尔型等数据转换为字符串,以及将字符串转换为相应的数据类型。如果您需要了解更多函数和用法,可以查阅 Go 官方文档中的 strconv 包文档:https://pkg.go.dev/strconv。原创 2023-08-09 12:51:10 · 2525 阅读 · 0 评论 -
go判断两个字典/切片 是否相等
【代码】go判断两个字典/切片 是否相等。原创 2023-01-28 20:36:06 · 5353 阅读 · 0 评论 -
go切片在指定位置插入元素
第一个示例追加了一个元素到切片 slice 中,创建了一个新的切片 newSlice。第三个示例将一个切片 slice2 追加到切片 slice 的末尾,创建了一个合并后的切片 combinedSlice。如果原始切片的容量不足,append 函数将创建一个新的底层数组,并将原始切片的元素复制到新数组中,然后再追加新的元素。如果追加的元素超过了切片的容量,append 函数会自动分配更大的底层数组来容纳新的元素。append 函数返回一个新的切片,而不会修改原始的切片。slice:要追加元素的切片。原创 2023-01-28 20:29:50 · 7079 阅读 · 1 评论 -
go对列表和字典排序
即可,但是去重没有直接的方法,需要遍历。原创 2023-01-28 20:16:31 · 8669 阅读 · 0 评论 -
go数据类型和类型转换
Go 语言是一种静态类型语言,它具有丰富的基本数据类型,同时也支持用户定义的结构体、接口等高级数据类型, Go 语言的一些基本数据类型:整数类型:int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64浮点数类型:float32, float64复数类型:complex64, complex128布尔类型:bool字符串类型:string字节类型:byte (uint8 的别名)原创 2023-01-28 19:42:45 · 2586 阅读 · 0 评论 -
go获取多组输入
使用fmt.Scanln和Scan都会用空格截断,无法获取空格之后数据。需求:获取多组输入,每组一行,两个数据以空格隔开。第二组输入的时候就退出了,原因后续跟进。原创 2022-12-28 18:06:01 · 3976 阅读 · 0 评论 -
go可变参数
在可变参数函数的声明中,最后一个参数的类型前面带有省略号,即(…它表明该函数可以调用任意数量的这种类型的参数。当在可变参数函数中不传递任何参数时,函数内部的默认为nil。数组作为函数入参,如果入参和传参的数组大小不一致,不能将可变参数用作返回值,但可以将其作为切片返回。还可以在可变参数函数中传递多个切片。可变参数函数通常用于字符串格式化。原创 2022-12-28 16:15:08 · 4151 阅读 · 0 评论 -
Golang开发--结构体的使用
Golang结构体结构体是由一系列具有相同类型或不同类型的数据构成的数据集合在golang结构体可以为不同项定义不同的数据类型1.结构体格式:type struct_variable_type struct { member definition member definition ... member definition}2.变量声明:variable_name := structure_variable_type {value1, value2...valuen原创 2021-04-20 14:11:53 · 3012 阅读 · 1 评论 -
Golang开发--指针的使用
在 Go 语言中,指针是一种特殊的数据类型,用于存储变量的内存地址。指针允许我们通过引用变量的内存地址来直接访问和修改变量的值,而不是对变量本身进行操作。以下是关于 Go 指针的重要特点和描述:内存地址:每个变量在计算机内存中都有一个唯一的地址。指针存储的就是这个地址。声明指针:在 Go 中,可以使用 * 运算符来声明指针类型。例如,var ptr *int 声明了一个名为 ptr 的指向整型变量的指针。取地址运算符:使用 & 运算符可以获取变量的地址。原创 2021-04-19 20:20:56 · 2883 阅读 · 1 评论 -
Golang开发--全局变量/局部变量
1.全局变量在函数体外声明的变量,它可以在整个包中使用,包被导入后也可以被使用。package mainimport "fmt"var te =10func main(){ testfunc() fmt.Println("te=",te)}func testfunc(){ var tt int tt=te*te fmt.Println("te*te=",tt)}运行结果为:te*te= 100te= 10...原创 2021-04-19 12:41:45 · 7840 阅读 · 1 评论 -
Golang开发-数组和列表
Go 语言的切片操作非常方便,可以使用内建函数 make 来创建切片,使用索引访问和修改切片的元素,使用 append 函数追加元素,使用切片表达式进行切片切割等。在 Go 语言中,数组是值类型,当将一个数组赋值给另一个数组或将数组作为函数参数传递时,会进行数组的复制,而不是引用。可以使用 len 函数获取数组的长度。自动扩容:当切片容量不足以容纳新的元素时,切片会自动扩容,分配一个更大的底层数组,并将原有元素复制到新数组中。切片长度和容量:切片的长度表示当前切片中的元素数量,容量表示底层数组的大小。原创 2021-04-13 17:19:56 · 2991 阅读 · 5 评论 -
Golang开发-函数的使用
Go 语言最少有个 main() 函数。函数声明告诉了编译器函数的名称,返回类型,和参数。定义:func function_name( [parameter list] ) [return_types] { 函数体}func:函数由 func 开始声明function_name:函数名称parameter list:参数列表,指定参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不包含参数。return_types:返回类型,函数返回一列值。return_types 是该原创 2021-04-12 16:23:34 · 2447 阅读 · 0 评论 -
Golang开发-逻辑运算符和位运算符
逻辑运算符运算符描述&&逻辑 AND 运算符:如果两边的操作数都是 True,则条件 True,否则为 False//逻辑 OR 运算符:如果两边的操作数有一个 True,则条件 True,否则为 False!逻辑 NOT 运算符:如果条件为 True,则逻辑 NOT 条件 False,否则为 True逻辑 OR 运算符为:||(表格打不出来)package mainimport "fmt"func main(){ var a bool原创 2021-04-09 17:39:20 · 2445 阅读 · 0 评论 -
Golang开发-常量和变量
Golang变量1.声明变量使用关键字var一般形式:var x xtype一次声明多个变量:var x1,x2 xtype示例代码:package mainimport "fmt"func main() { var a string = "test" fmt.Println(a) var b, c int = 1, 2 fmt.Println(b, c)}执行代码运行结果为:test1 22.声明变量的方式1)指定变量类型,如果没原创 2021-04-09 15:59:09 · 2478 阅读 · 6 评论 -
Golang开发-包声明和包引入
Go 语言的基础组成有以下几个部分:包声明引入包函数变量语句 & 表达式注释示例代码:hello.gopackage mainimport "fmt"func main() { fmt.Println("Hello, World!")}包声明1.第一行代码 package main 定义了包名。2.必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package main。3.package main表示一个可独立执行的程序,每个 Go 应用程序都包含一原创 2021-04-09 14:56:10 · 2930 阅读 · 7 评论