
Golang学习
文章平均质量分 56
Golang学习
小菜鸡本菜
努力学习ing
展开
-
Golang单元测试、Mock测试以及基准测试
Golang拥有一套单元测试和性能测试系统,仅需要添加很少的代码就可以快速测试一段需求代码。单元测试主要包括:输入、测试单元、输出、期望以及与期望的校对。测试单元包括函数或者结合了一些函数的模块等。我们通过将输出与期望值进行校对,来验证代码的正确性。通过单元测试,可以一方面保证质量,例如在覆盖率足够的情况下,如果在旧代码中添加了新的代码,通过单元测试可以验证新的代码是否破坏了功能正确性。另一方面,也提升了效率,例如代码中出现了bug,通过编写单元测试,我们能够在较短的时间内定位或修复问题。规则1:所有测试文原创 2022-06-29 10:41:41 · 1943 阅读 · 0 评论 -
【Golang】go语言实现数据结构——堆
堆一种特殊的树,满足下面两个条件:堆总是一棵完全二叉树。堆中某个节点的值总是大于等于(小于等于)其所有子节点的值。如果是大于等于情况就称为大顶堆,小于等于情况就是小顶堆。在Java语言中,我们可以直接使用容器PriorityQueue实现堆。Golang也存在类似的实现方式,但本文先介绍一下手动实现,再介绍如何使用golang提供的接口实现。一、手撕代码实现1.1、说明由堆的性质可知,堆是一颗完全二叉树,因此,利用数组(切片)结构来存放堆最合适。假设某结点数组下标为i(i>=1),原创 2022-05-04 21:38:30 · 2083 阅读 · 5 评论 -
Golang切片reslice操作导致内存泄露问题以及解决方法
一、遇到的问题某次刷力扣题时,我在算法中使用切片来充当队列,毕竟利用切片的可伸缩性质很容易实现一个队列,简易的切片实现队列代码如下所示://入队slice = append(slice, 1)//出队slice = slice[1:]除此之外,还可以利用Golang提供的container包中的list来实现队列。题目并不难,就是二叉树层序遍历,但提交代码后确出现如下错误:runtime: out of memory: cannot allocate 134217728-byte bl原创 2022-04-06 17:19:04 · 3233 阅读 · 0 评论 -
【Go】gin框架的ShouldBindQuery与BindQuery的区别
前言Gin文档地址:https://gin-gonic.com/zh-cn/docs/examples/binding-and-validation/使用gin框架进行模型绑定时,似乎使用两种绑定方法都可以,我很好奇ShouldBindQuery与BindQuery的区别,于是查了一下资料,果然是自己没有好好看文档。Gin提供了两类绑定方法:Must bindMethods - Bind, BindJSON, BindXML, BindQuery, BindYAMLBehavior - 这些原创 2022-02-16 19:24:57 · 10494 阅读 · 0 评论 -
Go字符串拼接的方式与性能对比
Go中字符串的特殊之处Go中的字符串是 UTF-8 字符的一个序列(当字符为 ASCII 码时则占用 1 个字节,其它字符根据需要占用 2-4 个字节)。由于该编码对占用字节长度的不定性,Go 中的字符串里面的字符也可能根据需要占用 1 至 4 个字节,这与其它语言如 C++、Java 或者 Python 不同(Java 始终使用 2 个字节)。Go 这样做的好处是不仅减少了内存和硬盘空间占用,同时也不用其它语言那样需要对使用 UTF-8 字符集的文本进行编码和解码。字符串是一种值类型,且值不可变,即创原创 2022-01-22 16:22:56 · 1534 阅读 · 1 评论 -
【Go】go init函数
前言之前有一次我在写程序的时候,创建了一个init函数func init(),起初我并不知道init()是go本身自带的一个函数,类似于main(),于是我给init()函数设置返回值时,Goland提示错误,当时很纳闷,百度了才知道这回事。由此,写一篇博客,以记录init()函数用法。init函数介绍init()函数是一个特殊的函数,存在以下特性:不能被其他函数调用,而是在main函数执行之前,自动被调用init函数不能作为参数传入不能有传入参数和返回值以下是《the way to g原创 2022-01-14 22:07:56 · 5061 阅读 · 1 评论 -
【Go】将切片作为参数传入函数并使用append方法遇到的问题
切片的内部结构:type SliceHeader struct { Data uintptr Len int Cap int}由切片的结构定义可知,切片的结构由三个信息组成:指针Data,指向底层数组中切片指定的开始位置长度Len,即切片的长度容量Cap,也就是最大长度,即切片开始位置到数组的最后位置的长度问题:将切片作为函数参数传入时,在函数内使用append方法并不能改变切片。如下述代码所示:func main() { //创建一个长度和容量均为3原创 2021-08-29 16:09:54 · 3646 阅读 · 11 评论 -
【Go】使用jquery无法获取Gin设置的cookie问题
问题:在代码中,已经添加cookie,如下:func LoginCheck(c *gin.Context) { //省略 ... c.SetCookie("username",id.(string),1800,"/","localhost",false,true) c.SetCookie("password",id.(string),1800,"/","localhost",false,true) //省略 ...}在JS代码中原创 2021-07-15 22:32:10 · 498 阅读 · 0 评论 -
Go中使用new创建对象和直接字面量创建对象的区别
区别:使用new创建对象返回对象指针,而直接使用字面量创建对象返回对象本身。测试:func main() { // s1 := stu{ name: "xm", age: 11, } // s2 := new(stu) s2.name = "xh" s2.age = 12 // fmt.Printf("%T\n", s1) fmt.Printf("%T\n", s2)}结果:main.stu*main.stu...原创 2021-07-05 16:16:40 · 1274 阅读 · 0 评论 -
go在函数中直接对切片赋值遇到的问题
问题:刷题的时候碰到个问题,将切片作为参数传入函数,并在函数中对切片进行重新赋值时,原本的切片不会改变。后来想想这其实是一个很基础的问题,但也记录一下,提醒自己。//主函数func main() { s1 := []int{111, 222, 333} //将s1传递给in参数 test(s1) fmt.Println(s1)}//test函数func test(in []int) { out := []int{1, 2, 3} in = out f原创 2021-06-28 14:20:40 · 2784 阅读 · 0 评论 -
protoc导出时遇到protoc-gen-go unable to determine Go import path解决方法
使用如下命令将.proto文件转换为go文件时,发生错误。命令:protoc --go_out /. *.proto发生错误:C:\Users\Bestzy\go\src\awesomeProject\pb>protoc --go_out /. myproto.protoprotoc-gen-go: unable to determine Go import path for "myproto.proto"Please specify either: • a "go_原创 2021-06-27 17:06:51 · 4860 阅读 · 2 评论 -
【Golang】Go实现简易的登入页面
题目:结合net/http和database/sql实现一个使用MySQL存储用户信息的注册及登陆的简易web程序。代码:package mainimport ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" "net/http")var db *sql.DBfunc initDB() (err error) { dsn := "root:root@tcp(127.0.0.1:3306)/db1" db, er原创 2021-05-17 17:04:47 · 2261 阅读 · 0 评论 -
【Golang】Go语言自定义类型和类型别名
自定义类型在Go语言中有一些基本的数据类型,如string、整型、浮点型、布尔等数据类型, Go语言中可以使用type关键字来定义自定义类型。自定义类型是定义了一个全新的类型。我们可以基于内置的基本类型定义,也可以通过struct定义。例如://将MyInt定义为int类型type MyInt int通过type关键字的定义,MyInt就是一种新的类型,它具有int的特性。类型别名类型别名是Go1.9版本添加的新功能。类型别名规定:TypeAlias只是Type的别名,本质上TypeAli转载 2021-05-16 21:47:19 · 693 阅读 · 0 评论 -
【Golang】Go语言类型断言
接口概念一个接口的值(简称接口值)是由一个具体类型和具体类型的值两部分组成的。这两部分分别称为接口的动态类型和动态值。非空接口的底层数据结构是iface,其代码如下(代码位于src/runtime/runtime2.go中):type iface struct{ tab *itab //itab存放类型及方法指针信息 data unsafe.Pointer //数据信息}iface的结构很简单,有两个指针类型字段。itab:用来存放接口自身类型和绑定的实例类型及实例原创 2021-04-28 21:08:38 · 678 阅读 · 1 评论 -
【Golang】Go语言数组定义与初始化方式
Go语言数组定义与初始化数组的定义var 数组变量名 [元素数量]T比如:var a [5]int。注意数组的长度必须是常量,且长度属于数组类型的一部分,定义之后不允许修改长度。因此 [5]int和[10]int是不同的类型。var arr1 [3]intvar arr2 [4]intarr1 = arr2 //错误,此时arr1和arr2是不同的类型数组可以通过下标进行访问,下标是从0开始,最后一个元素下标是:len-1。数组的初始化方式数组的初始化方式有很多。方式一func原创 2021-04-20 16:51:30 · 15792 阅读 · 0 评论 -
【Golang】非侵入式接口与侵入式接口
Go的接口是非侵入式的设计,也就是说,一个具体类型实现接口不需要再语法上显式地声明,只要具体类型的方法集是接口方法集的超集,就代表该类型实现了接口,编译器在编译时会进行方法集的校验。侵入式接口实现类需要明确声明自己实现了某个接口。如Java的继承形式:首先创建好了speak接口public interface speak { void speak();}human类需要实现speak接口的话,需要使用implement关键字声明实现了该接口public class human i.原创 2021-04-14 21:57:42 · 587 阅读 · 0 评论