小蜜蜂爱编程
积跬步以致千里,积小流以成江海
展开
-
go导包注意事项
go添加新的包后,需要执行go mod tidy,来更新依赖包。原创 2024-05-17 11:38:45 · 222 阅读 · 0 评论 -
go语言net包里面的PostForm
/ 在客户端的请求,可能会被自动添加或重写Header中的特定的头,参见Request.Write方法。// 对启用了TLS的连接,本包的HTTP服务器会在调用处理器之前设置TLS字段,否则将设TLS为nil。// HTTP规定头域的键名(头名)是大小写敏感的,请求的解析器通过规范化头域的键名来实现这点。// Form是解析好的表单数据,包括URL字段的query参数和POST或PUT的表单数据。// Close在服务端指定是否在回复请求后关闭连接,在客户端指定是否在发送请求后关闭连接。原创 2024-04-17 10:52:49 · 763 阅读 · 0 评论 -
go语言context
Context 是请求的上下文信息。对于RPC Server来说,一般每接收一个新的请求,会产生一个新的Context,在进行内部的函数调用的时候,通过传递Context,可以让不同的函数、协程保持相同的上下文信息,以达到数据传递、流程控制的目的。Context的数据以一种链表数据结构进行存储,如添加超时、取消、数据都会新在原来的Context的基础上派生出一个新的Context。不会对原来的Context修改。Context 有很多实现,没有一个标准规定Context应该是什么样的。原创 2024-04-17 11:16:46 · 444 阅读 · 0 评论 -
go语言基础 -- 反射
反射可以在运行时动态获取变量的信息,如变量的类型(type),类别(kind)。如果是结构体变量,还可以获取到变量的字段、方法等结构体本身信息;通过反射,可以修改变量的值或调用关联的方法;使用反射需要import(“reflect”)我们前面的文章空接口接收任意类型的变量,通过typeof来判断变量类型。原创 2024-04-12 09:34:29 · 999 阅读 · 1 评论 -
go语言基础 -- 单元测试
2、gomock – 除了手动实现接口和桩对象,你还可以使用第三方库来帮助你更容易地打桩。例如,github.com/golang/mock库允许你自动生成接口的桩实现,并在测试中使用它们。一种常见的做法是将外部依赖定义为接口,并在你的函数或方法中使用这些接口。这样,在测试中,你可以替换这些接口的实现为桩对象(stub objects)。这要求我们在做开发时同时考虑到可测性。calc_test.go所有以Test开头的函数都会被执行,比如我们增加一个。go语言有自己的测试框架,封装在testing包中。原创 2024-03-07 15:49:11 · 615 阅读 · 0 评论 -
go语言基础 -- json的序列化
反序列化map类似,反序列化map时不需要通过make来开辟空间,Unmarshal里面会进行make,同时map字段的顺序需要严格一致。结构体要序列化成自己的标签名字看我们前面的文章即可,此处不再赘述。原创 2024-03-07 11:21:04 · 780 阅读 · 1 评论 -
go语言基础 -- goroutine与管道
管道本身就是一个先入先出的队列,但它是一个线程安全的队列,同时有类型,string类型的channel只能存储string类型的数据,虽然我们也可以用interface来存储多类型,但用的时候也需要用类型断言判断类型后再使用,声明管道的方式如下:var 管道名 chan 数据类型// 管道创建与初始化// 管道写入数据num := 100// 从管道中读取数据需要注意的是,channel中的数据如果已经取完了,再取会报错,报死锁,如果channel满了,就不能再放入了,再放也会报错。原创 2024-03-12 09:12:29 · 1110 阅读 · 0 评论 -
go语言基础 -- 常量细节
【代码】go语言基础 -- 常量细节。原创 2024-03-13 09:56:20 · 595 阅读 · 0 评论 -
go语言基础 -- 文件操作
go里面的文件操作封装在os包里面的File结构体中,要用的时候最好去查下官方文档,这里介绍下基本的文件操作。原创 2024-03-06 11:37:35 · 630 阅读 · 0 评论 -
go语言基础 -- go程序的命令行参数
我们可以用flag包里面的函数来实现像mysql -h 12.123.44.99 -u lzs -P 5809 -p xxx这样的命令行参数,下面是一个示例。go里面程序的参数是存储在os.Args切片中的,下面是一个示例。原创 2024-03-06 21:27:47 · 932 阅读 · 0 评论 -
go语言基础 -- 面向对象 -- 接口与多态
go语言中,接口类型可以定义一组方法,不需要在接口定义中实现方法,并且interface中不能含有变量,如果某个自定义类型要使用时再实现接口的方法。golang中的接口不需要显式地实现,只要一个类型实现了接口所有的方法,那么这个类型就实现了这个接口接口的声明与实现import ("fmt"// 声明一个接口// 声明两个没有实现的方法Start()Stop()// 让Phone实现Usb接口的方法// 实现一个接口,就是实现接口的所有方法// Working接收一个Usb接口的参数。原创 2024-03-05 00:38:52 · 971 阅读 · 0 评论 -
go语言基础 -- 类型断言及其应用
我们直接通过一个案例来描述类型断言比较直观import("fmt"X intY inta = point//b = a // 这种写法是有问题的,不能直接将一个接口类型赋值给一个自定义类型// 这句话的意思是,判断a是否指向Point类型,若指向,则转成Point类型,这就是类型断言if is_ok {} else {原创 2024-03-05 00:39:09 · 611 阅读 · 1 评论 -
go语言基础 -- 面向对象编程
当我们省略写法调用基类型的字段或方法时,编译器首先在当前类型中找有没有对应的字段或方法,有就调用,没有就看其嵌套的结构体有没有。在go语言中,如果一个结构体中嵌套了另一个匿名结构体对象,那么这个结构体可以直接访问这个匿名结构体的字段和方法(无论大小写),从而实现继承的特性。面向对象编程离不开封装、继承、多态三个特性,go语言与其他c++、java不太一样,没有类的概念,面向对象的实现也有些区别,下面分别描述。由于多态涉及到接口的概念,我们在下一个篇章来讲解。匿名数据类型在同一个结构体中,只能有一个。原创 2024-03-04 16:56:42 · 677 阅读 · 0 评论 -
go语言基础 -- map的定义与使用
map的key可以是基本数据类型,channel,接口,结构体,数组,但不能是slice,map,function,因为他们不能用==判断,声明时不会开辟内存,分配内存需要用到make,make分配内存之后才能使用。make时通过size指定分配可存储的key-value个数,需要注意的是,go里面的map是无序的,但同样的,key也不能重复,重复时保留最后一个存储的数据。如果切片的数据类型是map,则称作map切片,map切片的好处是可以动态增长,理解起来可以看错c++中的vecrtor存了个map。原创 2024-02-29 22:42:51 · 464 阅读 · 0 评论 -
go语言基础 -- 二维数组
先声明/定义,再赋值以上二维数组有4个指针分别指向自己的地址空间,各个指针指向的地址空间也是连续的。原创 2024-02-29 22:43:51 · 548 阅读 · 0 评论 -
go语言基础--结构体
age int声明好一个结构体后可以直接将其看做一个类型来使用// 返回结构体指针// 值得注意的是,go里面指针的用法,标准用法和c/c++里的一样,但也可以不用*直接引用// 这种写法也允许,go语言做了转换,转换的过程被隐藏到编译底层了。原创 2024-03-02 14:42:28 · 388 阅读 · 0 评论 -
go语言基础 --工厂模式的应用
有时候我们定义一个结构体,并不想让其暴露给其他包,但有些指定的外部包需要调用,这时可以使用工厂模式的思想,在本包内创建结构体对象,通过一个函数返回出去,或者在一个函数里面创建对象并返回;如果上面的结构体Name或Age为小写,其他包也不可以直接获取,这时可以使用结构体绑定方法的方式返回成员值。原创 2024-03-04 10:10:41 · 410 阅读 · 0 评论 -
go语言基础--方法
golang中的方法是作用在指定数据类型的,所有自定义类型都可以绑定对应的方法,可以类似理解为其他语言中类的成员函数。可以总结为值类型或指针类型的决定因素是方法的绑定类型是值类型还是指针类型。原创 2024-03-04 09:40:06 · 489 阅读 · 0 评论 -
go语言基础 -- 切片
切片的遍历与数组的遍历是一样的,可以用len(slice),也可以用for range,切片本身还能再切,可以使用另外一个切片对当前切片切分,但这两个切片引用的都是同一个数组;转byte可以处理英文和数字,但不能处理中文,byte是字节编码,不是字符编译,中文3个字节,需要用[]rune,直接把上面byte换成[]rune即可。使用append()内置函数可以动态增加切片容量,切片容量足够时,会在切片末尾添加元素,不够时会分配新的基本数组,函数返回新的切片。原创 2024-02-24 09:52:18 · 397 阅读 · 1 评论 -
go语言基础 -- 数组
在go里面数组是同一个数据类型多个值的组合,长度一旦定义了就不能变化。数组中可以是任意类型的数据,包括引用和值类型,使用时下标也不能越界。// 定义一个float64类型的数组,长度为2,数组定义好之后元素就已经会被赋予初始值,数组的地址可以用&my_list获取,第一个元素的地址与之相同var my_list2 = [3]int{2, 3, 4}`在这里插入代码片`我们还可以在初始化的时候指定元素下标// 指定第一个元素为56,第二个为79// 可以使用go的自动类型推导。原创 2024-01-02 09:32:26 · 453 阅读 · 0 评论 -
go语言基础 --时间处理常用函数
时间戳有时用于生成随机数或前后端时间传递,我们可以使用time的Unix和UnixNano方法,Unix方法返回自1970年1月1日00:00:00的总秒数,UnixNano返回总纳秒数。这里的月分是time.Month,如果想用int,可以用int(month)进行强转。时间和日期相关的函数是开发中常用的,go语言中,引入time包即可使用相关的函数。原创 2023-12-26 20:26:53 · 955 阅读 · 0 评论 -
go语言基础 -- 异常处理机制
go异常处理机制原创 2023-12-27 19:31:07 · 514 阅读 · 0 评论 -
go语言基础 -- 内置函数入门
golang的设计者为了编程方便,提供了一些可以直接使用的函数(无需引入包),这些函数称为内置函数。内置函数见文档:https://studygolang.com/pkgdoc 里面的builtin系列。原创 2023-12-26 20:56:58 · 397 阅读 · 0 评论 -
go语言基础 -- 字符串及其常用函数
虽然我们可以通过官网去查询想函数,但一些常用的函数日常开发中还是需要熟练的。下面我们来看下go语言中字符串相关的常用函数。原创 2023-12-24 15:39:58 · 584 阅读 · 0 评论 -
go语言函数三、匿名函数
go匿名函数原创 2023-12-21 09:44:48 · 447 阅读 · 0 评论 -
go语言基础 -- defer及其用法
在go语言中,程序员创建的资源如文件句柄、数据库连接、锁等,需要在函数执行完毕后释放,因此go提供了defer的机制,在函数退出时去释放defer指定的资源,这样我们在一些资源申请的时候,可以先defer 声明释放语句,无需担心后续忘记释放资源。defer利用了栈,先声明的defer后执行。上面的输出会先输出n3,然后在函数退出时执行defer的栈内容,先输出n2,再输出n1,最后输出res。,这意味着我们defer之后对变量的变更不会影响入栈时的值。原创 2023-12-24 14:12:07 · 758 阅读 · 0 评论 -
go语言基础 -- 闭包
闭包的概念,在很多语言中都有,比如python,这里要介绍的go,闭包就是函数与其相关的环境组合的一个整体。// 返回的是一个函数n = n + xreturn nf(1)f(2)f(3)这里内部定义的func和n组成一个闭包,Addfunc是一个函数,返回一个匿名函数,这个匿名函数和其函数外部的变量n就构成了闭包。我们用类的思想很容易理解闭包,可以把闭包看成一个类,它里面包含变量是成员变量,它的函数是其成员函数。我们分析闭包,关键也是在于看其函数和引用到的变量。原创 2023-12-24 13:27:00 · 475 阅读 · 0 评论 -
【go语言实践】基础篇 -- go语言“包“的操作及函数基本格式
golang原创 2023-12-19 00:03:44 · 431 阅读 · 0 评论 -
go语言函数一、函数定义细节
测试用后面加内容。原创 2023-12-19 15:44:07 · 583 阅读 · 0 评论 -
go语言函数二、init函数定义与作用
在go语言中,每一个源文件都可以包含一个init函数,这个函数会在main函数执行前,被go运行框架调用,注意是在main函数执行前。import ("fmt"上述代码init会被先打印因此我们通常使用init函数来完成包的初始化工作。原创 2023-12-20 22:54:56 · 844 阅读 · 0 评论 -
【go语言实践】基础篇 - 流程控制
for range遍历字符串时,是按照字符来遍历的,而不是按照字节来遍历的。与我们常规字节遍历的区别在于,像遍历中文字符串,for range会打印一整个中文字符,但常规字节遍历会打印单个字节(一个中文两个字节),通常会乱码。go里面没有while和do while语句,要跳出循环也是break,跳过本次循环continue,另外go语言也支持goto语句跳到任意语句处,但最好不要用。在一个case语句中使用fallthrough,则会继续执行下一个case分支,注意这里下一个分支不用判断,直接执行。原创 2023-12-11 22:57:56 · 251 阅读 · 0 评论 -
【go语言实践一】go语言基础篇一
go语言笔记(基础到实战案例)原创 2023-12-11 15:18:12 · 354 阅读 · 0 评论 -
【go语言实践】go运算符
go语言的运算符与c的基本一致。原创 2023-12-11 19:39:04 · 86 阅读 · 0 评论 -
【go语言实践】基础篇二 -- 值类型、命名规范、导入包及go指针
go中值类型变量直接存储值,内存通常在栈中分配,引用类型变量存储的是一个地址,这个地址对应的对应的空间才真正存储数据,当没有任何变量引用该地址时,该地址对应的数据空间就会被go的GC(垃圾回收机制)回收。go中所有值类型都有对应的指针类型,形式都为*type,type为具体的数据类型。值类型包括基本数据类型、数组、结构体。我们不需要写全绝对路径,在我们已经配置了系统环境变量GOPATH的情况下,也不用写src,go默认会给我们加src。我们不能将一个整形的地址赋值给一个double类型的指针。原创 2023-12-11 18:16:54 · 364 阅读 · 1 评论