![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Go语言笔记
文章平均质量分 53
开心码农1号
我很懒,我不想添加简介!
展开
-
Go语言 字节数组和string
字符串和字节数组:字符串:是8位字节的集合,可以为空,不能为nil。字符串的定义为一个结构体(一个字段指向字节数组的指针,第二个字段为len长度)[]byte:byte是uintptr8的别名,字节数组的定义(第一个字段为数组的指针,第二个字段表示长度 第三个字段表示容量),看起来和string很像,实则差别很大。区别:字符串值不能更改,但可以被替换,字符串底层的指针指向的是一个字符串常量的地址,这个地址是只读的,地址内容不可以被改变,但指针可以指向不同的地址。区别总结:更改变量时,[]byte结构体里,原创 2021-07-02 09:23:27 · 993 阅读 · 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 · 2688 阅读 · 0 评论 -
程序员笔记:安装包类型、go语言编译约束
原文链接:https://blog.csdn.net/u012206617/article/details/97759325。二进制包,已编译好的可直接使用的程序,解压缩后,点击bin目录下的.sh或者.bat执行文件即可使用。如上标注:只能在unix下编译;windows系统则无法编译;源代码包,需要经过计算机编译才能执行安装。安装程序,执行exe文件即可以安装。原创 2023-06-22 00:15:00 · 94 阅读 · 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 · 12686 阅读 · 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 · 2503 阅读 · 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 · 272 阅读 · 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 · 341 阅读 · 0 评论 -
go 信道chan有缓冲通道跟无缓冲通道区别:
go通道chan:1、无缓冲:要求发送方和接收方的goroutine同时准备好,才能完成发送和接收操作。如果两个goroutine都没有准备好,通道会导致先执行发送或者接收的goroutine阻塞等待,这种对通道进行发送跟接收的交互行为本身就是同步的。2:有缓冲的通道:一种在被接收前能存储一个或多个值的通道。并不强制goroutine直接必须同时完成发送和接收,只有通道中没有要接收的值时,接收动作才会阻塞,只有在通道没有可用的缓冲区容纳被发送的值时,发送动作才会阻塞。...原创 2021-06-23 17:55:06 · 2762 阅读 · 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 · 70 阅读 · 0 评论 -
golang编译过程
go编译的四个阶段一、词法分析与语法分析1.词法分析lex3是用于生成词法分析器的工具,lex 生成的代码能够将一个文件中的字符分解成 Token 序列。lexer 通过正则匹配的方式将机器原本很难理解的字符串进行分解成很多的 Token。词法分析器Scanner:对输入的字符流进行扫描,最终解析成token。2.语法分析器Parser语法分析的输入就是词法分析器输出的 Token 序列,然后将编程语言的所有生产规则映射到对应的方法上,这些方法构成的树形结构最终会..转载 2021-07-19 21:01:31 · 2457 阅读 · 0 评论 -
Go defer延迟函数的用法
Go语言的 defer 语句会将其后面跟随的语句进行延迟处理,在 defer 所在的函数即将返回时,将延迟处理的语句按 defer 的逆序进行执行,也就是说,先被 defer 的语句最后被执行,最后被 defer 的语句,最先被执行。当有多个 defer 行为被注册时,它们会以逆序执行(类似栈,即后进先出)一、defer特性1. 关键字 defer 用于注册延迟调用。2. 这些调用直到 return 后才被执。因此,可以用来做资源清理。3. 多个defer语句,按先进后出的方式执行。...原创 2021-07-16 01:35:58 · 170 阅读 · 0 评论 -
Go是值传递
一、Go语言(Golang)是值传递。Go是没有引用传递的。传值的意思是:函数传递的总是原来这个东西的一个副本,一副拷贝。比如我们传递一个int类型的参数,传递的其实是这个参数的一个副本;传递一个指针类型的参数,其实传递的是这个该指针的一份拷贝,而不是这个指针指向的值。首先我们要知道,任何存放在内存里的东西都有自己的地址,指针也不例外,它虽然指向别的数据,但是也有存放该指针的内存。Go语言中所有的传参都是值传递(传值),都是一个副本,一个拷贝。因为拷贝的内容有时候是非引用类型(int、stri.转载 2021-07-15 20:17:17 · 307 阅读 · 0 评论 -
Go 协程切换时机
Golang管理协程时也必然会涉及到协程之间的切换:阻塞的协程被切换出去,可运行的协程被切换进来。出现阻塞,意味 CPU 在当前执行域没活干了,它在干等,换 go 而言,调度器要 goroutine 上下文切换。至于切换到哪个 goroutine,由调度器决定。但可以肯定的是对同一 chan 所相关的 goroutine 执行有序1 、select操作阻塞时2、io阻塞3、阻塞在channel:chan 读写出现阻塞时,runtime 会隐式地进行上下文切换4、程序员显式编码操作原创 2021-07-13 22:36:39 · 1886 阅读 · 0 评论 -
Go垃圾回收机制
传统的系统级编程语言(主要指C/C++)中,程序员必须对内存小心的进行管理操作,控制内存的申请及释放。稍有不慎,就可能产生内存泄露问题,这种问题不易发现并且难以定位。C++通过指针引用计数来回收对象,但是这不能处理循环引用。为了避免引用计数的缺陷,后来出现了标记清除,分代等垃圾回收算法。过去一般采用两种办法:1、内存泄露检测工具:这种工具的原理一般是静态代码扫描,通过扫描程序检测可能出现内存泄露的代码段。然而检测工具难免有疏漏和不足,只能起到辅助作用。2、智能指针:这是 c++ 中引转载 2021-07-11 18:25:19 · 368 阅读 · 0 评论 -
Go内存溢出与内存泄露
一、内存泄露与内存溢出的区别内存溢出(out of memory,简称OOM)内存溢出是指程序在申请内存时,没有足够的内存空间供其使用,简单点说就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出出现out of memory异常。内存泄露(memory leak)内存泄露是指程序在申请内存后,无法释放已申请的内存空间,简单点说就是你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址..转载 2021-07-04 01:18:01 · 3713 阅读 · 0 评论 -
Go数组底层存读原理,跟链表区别
数组与链表:数组:数组的特点:在内存中,数组是一块连续的区域,数组需要预留空间,使用前先申请占内存的大小,可能造成内存空间的浪费。比如:申请十个元素,只插入6个元素,其余位置就浪费,如果插入11个元素,第11个元素就插入不了,或者重新找个新数组。插入和删除效率低:插入数据时,这个后面的数据在内存中要向后移,删除数据时,这个数据后面的数据要向前移动。随机读取率很高,因为数组是连续的,知道每个数据的内存地址,可以直接找到地址对应的数据。但不利于扩展,数组定义空间不够时,需要重新定义数组。数组:我们在读取第i个原创 2021-07-02 16:56:11 · 384 阅读 · 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 · 343 阅读 · 2 评论 -
进程、线程、协程的区别
1. 进程通俗的讲,程序运行起来就是进程每个进程都有自己的独立内存空间,拥有自己独立的地址空间、独立的堆和栈,既不共享堆,亦不共享栈。进程由操作系统调度原创 2021-06-04 01:15:10 · 776 阅读 · 0 评论 -
堆、栈的理解
全局变量保存在堆中,局部变量及函数保存在栈中原创 2021-06-04 01:13:07 · 125 阅读 · 0 评论