![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Go
文章平均质量分 70
@航空母舰
这个作者很懒,什么都没留下…
展开
-
Golang JSON变量不加Tag 反射获取Tag
如果结构体的字段有多个tag,比如叫otherTag,同样可以通过t.Field(i).Tag.Get(“otherTag”)获得。printTag方法传入的是j的指针。reflect.TypeOf(stru).Elem()获取指针指向的值对应的结构体内容。遍历结构体内的字段,通过t.Field(i).Tag.Get(“json”)可以获取到tag为json的字段。NumField()可以获得该结构体的含有几个字段。............原创 2022-08-31 11:36:40 · 680 阅读 · 0 评论 -
Golang 的锁机制
一个互斥锁只能同时被一个 goroutine 锁定,其它 goroutine 将阻塞直到互斥锁被解锁(重新争抢对互斥锁的锁定)。读写锁有四个方法:读的加锁、解锁,写的加锁、解锁。互斥锁有两个方法:加锁、解锁。RWMutex的使用主要事项。原创 2022-08-22 15:38:25 · 5049 阅读 · 0 评论 -
golang const常量
常量通常会被编译器在预处理阶段直接展开,作为指令数据使用,所以常量无法寻址。编译报错cannot take the address of i。常量不同于变量的在运行期分配内存,原创 2022-08-19 13:19:35 · 604 阅读 · 0 评论 -
Golang 接口以及自定义包
go语言接口由使用者定义,因为使用者用到了amDuck()这个函数,因此传入的duck接口需要定义amDuck()这个方法,这种思维更符合duck typing的思维,而传统的接口定义是反着来的,首先是实现者自己定义方法,使用者需要查看实现者定义了哪些方法,看自己是否能够使用。这里的isDuck函数被称为使用者,它使用了传入duck的amDuck()函数,因此duck被称为实现者。struct如果实现了Amduck()的话,它就会被认为是Duck的实现类,这种隐式的接口实现定义,..............原创 2022-08-16 10:00:33 · 559 阅读 · 0 评论 -
Golang 中make与new 区别
new 可以用来初始化泛型,并且返回储存位址。所以通常我们会用指标变数来接 new 过后的型别。特别要注意的是,new 会自动用 zeroed value 来初始化型别,也就是字串会是"",number 会是 0,channel, func, map, slice 等等则会是 nil。因为初始化的 map 会是 nil map,nil是不能直接赋值的。slice、map 以及 channel 类型的对象,三种类型都是结构。返回值为类型,而不是指针。make 是 Golang 的内建函数,...原创 2022-08-15 14:31:47 · 2906 阅读 · 0 评论 -
Golang 反射 runtime
的方法可以实现一个接口调用多个不同的函数,但是使用反射某种程度上也是牺牲了部分性能。任何方法都是有利有弊,通过。原创 2022-08-11 18:19:13 · 740 阅读 · 0 评论 -
Golang nil的妙用
代码块内部具有独立性质 (代码块内部定义的变量外部无法调用,但是代码块外定义的变量,代码块内可以调用)。但是代码块是要换行的。在golang中方法左括号{是不能换行的,不然编译不通过。..............................原创 2022-08-08 10:59:14 · 317 阅读 · 0 评论 -
Golang Break、Continue跳出多层循环
break 语句可以结束 for、switch 和 select 的代码块。Break在没有使用标签的时候break只是跳出了一层for循环。break 语句还可以在语句后面添加标签,表示退出某个标签对应的代码块,标签要求必须定义在对应的 for、switch 和 select 的代码块上。continue 语句可以结束当前循环,开始下一次的循环迭代过程,仅限在 for 循环内使用。在 continue 语句后添加标签时,表示开始标签对应的循环。.........原创 2022-08-05 16:05:51 · 2135 阅读 · 0 评论 -
Golang 作用域的坑 代码块
问题出在操作符:=,对于使用:=定义的变量,如果新变量与同名已定义的变量不在同一个作用域中,那么 Go 会新定义这个变量。对于本例来说,main() 函数里的 p 是新定义的变量,会遮住全局变量 p,导致执行到bar()时程序,全局变量 p 依然还是 nil,程序随即 Crash。这段代码原意是定义一个包内全局变量p,用foo()的返回值对p进行初始化,在bar中使用p。预期结果:bar()和main()中均输出5。在函数体外声明的变量称之为全局变量,全局变量可以在整个包甚至外部包(被导出后)使用。....转载 2022-08-04 17:25:28 · 227 阅读 · 0 评论 -
Golang = 比较与赋值
Go 中的数组是值类型,可比较,另外一方面,数组的长度也是数组类型的组成部分,所以 a 和 b 是不同的类型,是不能比较的,所以编译错误。原创 2022-08-04 12:00:28 · 583 阅读 · 0 评论 -
Golang 结构体坑总结
刚刚上手,我们都会习惯性的向下面这样赋值 ,示例如下。原创 2022-08-04 11:26:33 · 638 阅读 · 0 评论 -
Golang 空接口 空结构体
空接口是指没有定义任何方法的接口。因此任何类型都实现了空接口。空接口类型的变量可以存储任意类型的变量。空接口的应用1.空接口作为函数的参数使用空接口实现可以接收任意类型的函数参数。2.空接口作为map的值3.类型断言一个接口的值(简称接口值)是由一个具体类型和具体类型的值两部分组成的。这两部分分别称为接口的动态类型和动态值。因为空接口可以存储任意类型值的特点,所以空接口在Go语言中的使用十分广泛。....................................原创 2022-07-14 15:06:54 · 1264 阅读 · 0 评论 -
golang 函数 闭包 方法
defer的触发时机当前goroutine发生Panic时defer,return,返回值的执行顺序f1的执行结果是6, f2的执行结果是42,f3的执行结果是6最后看example3。它改写后变成f1的结果是6。f1是匿名返回值,匿名返回值是在return执行时被声明,因此defer声明时,还不能访问到匿名返回值,defer的修改不会影响到返回值。f2先给返回值r赋值,r=6,执行defer语句,defer修改r, r = 42,然后函数return。f3是有名返回值,但是因为r是作原创 2022-07-12 15:24:33 · 523 阅读 · 0 评论 -
golang 数组与切片
在 Go 中,与 C 数组变量隐式作为指针使用不同,Go 数组是值类型,赋值和函数传参操作都会复制整个数组数据。打印结果:可以看到,三个内存地址都不同,这也就验证了 Go 中数组赋值和函数传参都是值复制的。那这会导致什么问题呢?假想每次传参都用数组,那么每次数组都要被复制一遍。如果数组大小有 100万,在64位机器上就需要花费大约 800W 字节,即 8MB 内存。这样会消耗掉大量的内存。于是乎有人想到,函数传参用数组的指针。打印结果:这也就证明了数组指针确实到达了我们想要的效果。现原创 2022-07-06 16:59:31 · 532 阅读 · 0 评论 -
Golang 并发 通道 select
Golang 中对Channel 的支持添加了select关键字,通过select可以监听channel上的数据流动Golang中基于Channel select的实现由监控、定时器等示例,用于处理异步IO操作。执行流程有点类似switch case,case 后只能接channel输出,可以用变量接收:num:=.......................................原创 2022-06-15 14:59:05 · 769 阅读 · 0 评论 -
Golang 如何实现面向对象 方法
什么是面向对象在了解 Go 语言是不是面向对象(简称:OOP) 之前,我们必须先知道 OOP 是啥,得先给他 “下定义”。根据 Wikipedia 的定义,我们梳理出 OOP 的几个基本认知: 面向对象编程(OOP)是一种基于 "对象" 概念的编程范式,它可以包含数据和代码:数据以字段的形式存在(通常称为属性或属性),代码以程序的形式存在(通常称为方法)。 对象自己的程序可以访问并经常修改自己的数据字段。 对象经常被定义为类的一个实例。 对象利用属性和方法的私有/转载 2022-05-19 11:21:13 · 596 阅读 · 0 评论 -
golang 随机数
golang支持两种随机数生成方式:math/rand // 伪随机 crypto/rand // 真随机math/rand伪随机生成的数字是确定的,不论在什么机器、什么时间,只要执行的随机代码一样,那么生成的随机数就一样。为了尽量随机性,那么我们可以每次使用不同的seed来启动程序,就可以保证每次启动都产生新的随机数,聪明的你肯定想到了使用时间戳func main() { fmt.Println(rand.Intn(100)) //设置随机数种子,由于种子...原创 2022-05-19 10:01:58 · 1089 阅读 · 0 评论 -
Golang 中三个点...的总结
用法一:为函数设置不定长度的参数func myPrint(x ...interface{}) { for _, v := range x { fmt.Println(v) }}用法二:为数组设置默认长度a := [...]int{12, 32, 12}// [12 32 12] 3 3 [3]intfmt.Println(a, len(a), cap(a), reflect.TypeOf(a))用法三:append的时候用来追加切片slicefunc ma原创 2022-05-16 13:20:34 · 387 阅读 · 0 评论 -
GoLang 加密方法大全
以下Golang代码的加密结果与Java语言结果一致,需要注意结果大小写问题。package toolimport ( "appback/src/logger" "bytes" "crypto/aes" "crypto/cipher" "crypto/hmac" "crypto/md5" "crypto/rand" "crypto/rsa" "crypto/sha1" "crypto/sha256" "cryp原创 2022-05-12 16:17:42 · 1909 阅读 · 0 评论 -
Golang中的map类型
Golang中map的遍历输出的时候是无序的,不同的遍历会有不同的输出结果,如果想要顺序输出的话,需要额外保存顺序,例如使用slice,将slice中排序,再通过slice的顺序去读取。package mainimport ( "fmt" "sort")func main() { /* 声明索引类型为字符串的map */ var testMap = make(map[string]string) testMap["Bda"] = "B" testMap["Ada"] = "A"原创 2022-04-28 16:15:22 · 880 阅读 · 0 评论 -
golang 时间格式化
golang 的时间 认准 “ 2006-1-2 15:04:05.000 PM Mon Jan GMT ” 去格式化就可以了。package mainimport ( "fmt" "time")func main() { timeNow := time.Now() fmt.Println(timeNow.Format("2006-01-02 15:04:05")) // 2022-4-18 14:20:45 fmt.Println(timeNow.Format("2006/01/原创 2022-04-18 14:25:58 · 4098 阅读 · 0 评论 -
golang time strings常用方法
go用来指定睡眠时间的函数为time.Sleep。传入的为一个Duration,所以如果想睡眠5s钟,不能直接写 time.Sleep(5) ,而应该写time.Sleep(5 * time.Second)其中time.Second就是一个Duration类型,表示1s的时间间隔,乘系数5就得到5s的时间间隔。想要睡眠的时间可以使用自由组合,比如睡眠1小时10分5秒:time.Sleep(1*time.Hour + 10*time.Minute + 5*time.Second)time.S原创 2022-04-18 14:04:15 · 859 阅读 · 0 评论 -
Goland 设置与配置
GoLand 取消 import 自动导入将 tab 改为 4个空格导入项目后import里的包报红1.Goland--->Preferences...--->Go--->GOPATH--->Project GOPATH下添加命令行go env下的GOPATH值,自行修改自己的Project GOPATH2.正常情况下我们不需要自己去处理外部包的代理,但是也有可能就是你不经意之间做了修改,这边也是通过setting进行配置:...............原创 2021-10-09 10:58:47 · 12985 阅读 · 0 评论 -
golang 保留函数 及import _
import 下划线的作用:当导入一个包时,该包下的文件里所有init()函数都会被执行,然而,有些时候我们并不需要把整个包都导入进来,仅仅是是希望它执行init()函数而已。这个时候就可以使用 import _ 引用该包。即使用【import _ 包路径】只是引用该包,仅仅是为了调用init()函数,所以无法通过包名来调用包中的其他函数。package mainimport ( _ "quickstart/routers" "github.com/astaxie/beego")在看下r原创 2020-09-18 09:58:50 · 324 阅读 · 0 评论 -
Golang框架 GoFrame
在数据库中建立一个test数据库CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `content` varchar(255) DEFAULT NULL, `create_time` int(11) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;路由文件beego.Router("/test/write",原创 2020-09-18 09:47:35 · 2163 阅读 · 0 评论 -
golang 环境变量
一、GOPATH1、GOPATH是用于指定你的workspace 的环境变量,它内部目录一般为:$HOME/go --bin # 存放编译后的可执行文件 --pkg # 依赖包编译后的*.a文件 --src # 项目源代码的存放路径 2、1.8 版本以后,GO默认给你设置一个$GOPATH=$HOME/go,可自定义。3、我们可以指定不同的workspace(不同的开发项目):export GOPATH=$HOME/goproj01:$HOME/goproj02原创 2020-09-16 13:07:52 · 4324 阅读 · 0 评论