
Go语言笔记
文章平均质量分 59
开心码农1号
我很懒,我不想添加简介!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Go语言 字节数组和string
字符串和字节数组:字符串:是8位字节的集合,可以为空,不能为nil。字符串的定义为一个结构体(一个字段指向字节数组的指针,第二个字段为len长度)[]byte:byte是uintptr8的别名,字节数组的定义(第一个字段为数组的指针,第二个字段表示长度 第三个字段表示容量),看起来和string很像,实则差别很大。区别:字符串值不能更改,但可以被替换,字符串底层的指针指向的是一个字符串常量的地址,这个地址是只读的,地址内容不可以被改变,但指针可以指向不同的地址。区别总结:更改变量时,[]byte结构体里,原创 2021-07-02 09:23:27 · 1092 阅读 · 0 评论 -
Go语言map的使用及详解
Map是无序的键值对集合,是通过key 来快速检索数据,key 类似于索引,指向数据的值。Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的。package mainimport "fmt"func main() { //定义Map,不初始化,m值为空(nil),nil map 不能用来存放键值对 var m map[string]string fmt.Println(m, n.原创 2021-05-27 00:25:51 · 2884 阅读 · 0 评论 -
Go Modules 的基本使用
在 Go Modules 项目中,首次运行时下载依赖包的正确流程需要根据项目情况区分处理。后续开发中,每次添加或移除依赖后都应运行该命令,确保依赖与代码一致。将这两个文件加入版本控制,确保团队成员和 CI 环境使用相同的依赖版本。会自动分析代码中的导入语句,添加缺失的依赖,移除未使用的依赖,并更新。,它会自动分析代码并下载所需的依赖,同时保持。创建离线依赖副本(适用于无法联网的环境)。显示项目的依赖关系(直接依赖和间接依赖)。中记录的哈希值一致,防止篡改。中声明的所有依赖到本地缓存(检查下载的依赖是否与。原创 2025-05-09 21:26:25 · 1072 阅读 · 0 评论 -
Go语言中 源文件开头的 // +build 注释的用法
//+build注释用于Go语言中的条件编译,允许根据不同的构建标签(如操作系统、架构或自定义条件)编译特定文件。注释必须位于文件开头,与包声明之间需有空行,格式为//+build后跟空格和标签。标签逻辑中,同一行标签为“与”关系,不同行标签为“或”关系,可使用!表示取反。常见应用包括针对不同操作系统或架构的代码,以及自定义构建标签(如debug或prod)。编译时可通过-tags参数启用特定标签。优先级顺序为“与”>“或”>“非”。构建标签大小写敏感,仅适用于.go文件。Go 1.17及以上版原创 2025-05-09 21:19:43 · 589 阅读 · 0 评论 -
Go语言中的interface
Go 语言中的 interface 是一种抽象类型,它定义了一组方法签名,但不包含方法的实现。任何类型只要实现了 interface 中定义的所有方法,就被认为实现了该 interface。1、接口底层接口是引用类型。接口底层包含两个指针,一个指向具体类型信息另一个指向具体的值(或者是指向值的指针)。当你把一个实现了接口的值赋值给接口变量时,实际上是在复制这两个指针,而不是复制底层的值。空接口是一种特殊的接口类型,它不包含任何方法签名。原创 2025-03-28 06:30:00 · 383 阅读 · 0 评论 -
浅谈Go垃圾回收机制-面试笔记
全局变量在程序运行期间通常不会被回收,因为它们在整个程序的生命周期内都处于可达状态。代表已被垃圾回收器访问过,但它引用的其他对象尚未全部被访问完的对象。表示已被垃圾回收器访问过,并且其引用的所有对象也都已被访问过的对象。的所有对象,将那些仍然是白色的对象回收,释放它们占用的内存空间。表示尚未被垃圾回收器访问过的对象。初始时,所有对象默认都是白色。原创 2025-03-21 07:00:00 · 807 阅读 · 0 评论 -
go slice切片的理解
切片slice是对数组连续片段的引用,所以切片是一个引用类型。切片的结果定义是一个结构体:type slice struct{array unsafe.Pointerlen intcap int}array是指向数组的指针,cap总是大于等于len的。利用构造底层数据结构体,来造个切片:1、可以go内存地址中构造个切片:构造个虚拟结构体,把切片数据结果拼出来。s := ([]byte)(unsafe.Pointer(&结构体对象))2、还可以利用反射,go的反射中就存在一原创 2021-07-02 15:04:08 · 174 阅读 · 0 评论 -
Go 语言泛型
Go 语言在 1.18 版本中引入了泛型(Generics),这是 Go 语言自发布以来最重要的特性之一。泛型允许开发者编写更加通用和灵活的代码,减少重复代码的编写。原创 2025-02-11 01:20:24 · 404 阅读 · 0 评论 -
Go 语言里中的堆与栈
在 Go 语言中,编译器会进行逃逸分析,来决定一个变量是分配在栈上还是堆上。变量会分配在栈上,而。原创 2025-02-12 18:32:52 · 825 阅读 · 0 评论 -
程序员笔记:安装包类型、go语言编译约束
原文链接:https://blog.youkuaiyun.com/u012206617/article/details/97759325。二进制包,已编译好的可直接使用的程序,解压缩后,点击bin目录下的.sh或者.bat执行文件即可使用。如上标注:只能在unix下编译;windows系统则无法编译;源代码包,需要经过计算机编译才能执行安装。安装程序,执行exe文件即可以安装。原创 2023-06-22 00:15:00 · 135 阅读 · 0 评论 -
Go语言获取当天、昨天、明天、某天0点时间戳以及格式化时间
获取当前时间 到 明天0点整的时间差的秒级时间戳的字符串形式func GetTimeDifference() string { nowTime := time.Now() // 当天秒级时间戳 nowTimeStamp := nowTime.Unix() nowTimeStr := nowTime.Format("2006-01-02") //使用Parse 默认获取为UTC时区 需要获取本地时区 所以使用ParseInLocation t2, _ := time.ParseInLoc原创 2022-04-15 11:45:09 · 14388 阅读 · 0 评论 -
Go 语言 switch 语句 获取interface变量的实际Type类型
1、可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型。x.(type)相当于变量x的Type类型,即:reflect.TypeOf(x).Name()注意区别x的Kind类型;type BaseController struct {}func main() { var x interface{} x = BaseController{} switch i := x.(type) { case nil: fmt.Printf(" x原创 2022-04-06 19:08:56 · 2856 阅读 · 0 评论 -
Go语言中的继承与组合
package main// 父结构体type BaseController struct {}// 父结构体的方法func (c *BaseController) ReturnJson() {}// 继承type UserController struct { BaseController}// 组合type OtherController struct { userController UserController}func main() { // 调用 user.转载 2022-04-06 13:44:23 · 327 阅读 · 0 评论 -
Go连接redis代码记录
// Get Redis String Valuefunc GetRedisString(key string) (string, error) { redis_conn := rediswrapper.GetRedisPool().Get() if redis_conn.Err() != nil { logs.ERRORLOG("GetRedisPool Failed:%s", redis_conn.Err().Error()) return "", p.原创 2021-12-03 15:53:27 · 387 阅读 · 0 评论 -
go 信道chan有缓冲通道跟无缓冲通道区别:
通道(channel)是用来传递数据的一个数据结构,通道可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯,操作符 <- 用于指定通道的方向,发送或接收,如果未指定方向,则为双向通道。并不强制goroutine直接必须同时完成发送和接收,只有通道中没有要接收的值时,接收动作才会阻塞,只有在通道没有可用的缓冲区容纳被发送的值时,发送动作才会阻塞。,无需主动监测channel是否关闭,可以防止读取已经关闭的channel,造成读到数据为通道所存储的数据类型的零值。原创 2021-06-23 17:55:06 · 3211 阅读 · 0 评论 -
Go语言用法搜集
1、 strings.Join:将字符串数组中的所有元素拼接起来;比遍历字符串数组用“+”号拼接字符串的话,实现简单,且执行效率高多了少量拼接字符串时候用+便可,当数量大于3,或者字符串来自切片的时候,用strings.Join更好。func main() { list := []string{"ab", "cd","e"} test2 := strings.Join(list, "+") fmt.Println(test2) // ab+cd+e}...原创 2021-07-29 23:00:55 · 100 阅读 · 0 评论 -
golang编译过程
go编译的四个阶段一、词法分析与语法分析1.词法分析lex3是用于生成词法分析器的工具,lex 生成的代码能够将一个文件中的字符分解成 Token 序列。lexer 通过正则匹配的方式将机器原本很难理解的字符串进行分解成很多的 Token。词法分析器Scanner:对输入的字符流进行扫描,最终解析成token。2.语法分析器Parser语法分析的输入就是词法分析器输出的 Token 序列,然后将编程语言的所有生产规则映射到对应的方法上,这些方法构成的树形结构最终会..转载 2021-07-19 21:01:31 · 2643 阅读 · 0 评论 -
Go defer延迟函数的用法
Go语言的 defer 语句会将其后面跟随的语句进行延迟处理,在 defer 所在的函数即将返回时,将延迟处理的语句按 defer 的逆序进行执行,也就是说,先被 defer 的语句最后被执行,最后被 defer 的语句,最先被执行。当有多个 defer 行为被注册时,它们会以逆序执行(类似栈,即后进先出)一、defer特性1. 关键字 defer 用于注册延迟调用。2. 这些调用直到 return 后才被执。因此,可以用来做资源清理。3. 多个defer语句,按先进后出的方式执行。...原创 2021-07-16 01:35:58 · 221 阅读 · 0 评论 -
Go是值传递
一、Go语言(Golang)是值传递。Go是没有引用传递的。传值的意思是:函数传递的总是原来这个东西的一个副本,一副拷贝。比如我们传递一个int类型的参数,传递的其实是这个参数的一个副本;传递一个指针类型的参数,其实传递的是这个该指针的一份拷贝,而不是这个指针指向的值。首先我们要知道,任何存放在内存里的东西都有自己的地址,指针也不例外,它虽然指向别的数据,但是也有存放该指针的内存。Go语言中所有的传参都是值传递(传值),都是一个副本,一个拷贝。因为拷贝的内容有时候是非引用类型(int、stri.转载 2021-07-15 20:17:17 · 356 阅读 · 0 评论 -
Go 协程切换时机
Golang管理协程时也必然会涉及到协程之间的切换:阻塞的协程被切换出去,可运行的协程被切换进来。出现阻塞,意味 CPU 在当前执行域没活干了,它在干等,换 go 而言,调度器要 goroutine 上下文切换。至于切换到哪个 goroutine,由调度器决定。但可以肯定的是对同一 chan 所相关的 goroutine 执行有序1 、select操作阻塞时2、io阻塞3、阻塞在channel:chan 读写出现阻塞时,runtime 会隐式地进行上下文切换4、程序员显式编码操作原创 2021-07-13 22:36:39 · 2118 阅读 · 0 评论 -
Go垃圾回收机制
传统的系统级编程语言(主要指C/C++)中,程序员必须对内存小心的进行管理操作,控制内存的申请及释放。稍有不慎,就可能产生内存泄露问题,这种问题不易发现并且难以定位。C++通过指针引用计数来回收对象,但是这不能处理循环引用。为了避免引用计数的缺陷,后来出现了标记清除,分代等垃圾回收算法。过去一般采用两种办法:1、内存泄露检测工具:这种工具的原理一般是静态代码扫描,通过扫描程序检测可能出现内存泄露的代码段。然而检测工具难免有疏漏和不足,只能起到辅助作用。2、智能指针:这是 c++ 中引转载 2021-07-11 18:25:19 · 431 阅读 · 0 评论 -
Go内存溢出与内存泄露
一、内存泄露与内存溢出的区别内存溢出(out of memory,简称OOM)内存溢出是指程序在申请内存时,没有足够的内存空间供其使用,简单点说就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出出现out of memory异常。内存泄露(memory leak)内存泄露是指程序在申请内存后,无法释放已申请的内存空间,简单点说就是你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址..转载 2021-07-04 01:18:01 · 4188 阅读 · 0 评论 -
Go数组底层存读原理,跟链表区别
数组与链表:数组:数组的特点:在内存中,数组是一块连续的区域,数组需要预留空间,使用前先申请占内存的大小,可能造成内存空间的浪费。比如:申请十个元素,只插入6个元素,其余位置就浪费,如果插入11个元素,第11个元素就插入不了,或者重新找个新数组。插入和删除效率低:插入数据时,这个后面的数据在内存中要向后移,删除数据时,这个数据后面的数据要向前移动。随机读取率很高,因为数组是连续的,知道每个数据的内存地址,可以直接找到地址对应的数据。但不利于扩展,数组定义空间不够时,需要重新定义数组。数组:我们在读取第i个原创 2021-07-02 16:56:11 · 467 阅读 · 0 评论 -
docker 命令
dockerfile构建镜像的命令:docker run :创建一个新的容器并运行一个命令:docker run [OPTIONS] IMAGE [COMMAND] [ARG…]-d: 后台运行容器,并返回容器ID;-p: 指定端口映射,格式为:主机(宿主)端口:容器端口-P: 随机端口映射,容器内部端口随机映射到主机的端口–name=“nginx-lb”: 为容器指定一个名称;-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;-i: 以交互模式运行容器,通常与 -t 同时使用;转载 2021-06-22 01:49:01 · 465 阅读 · 2 评论 -
进程、线程、协程的区别
1. 进程通俗的讲,程序运行起来就是进程每个进程都有自己的独立内存空间,拥有自己独立的地址空间、独立的堆和栈,既不共享堆,亦不共享栈。进程由操作系统调度原创 2021-06-04 01:15:10 · 862 阅读 · 0 评论 -
堆、栈的理解
全局变量保存在堆中,局部变量及函数保存在栈中原创 2021-06-04 01:13:07 · 158 阅读 · 0 评论