![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Golang
Mreden
个人随身所记,希望可以帮到大家....
展开
-
Go 语言如何实现反射
interface,它是 Go 语言实现抽象的一个非常强大的工具。当向接口变量赋予一个实体类型的时候,接口会存储实体的类型信息,反射就是通过接口的类型信息实现的,反射建立在类型的基础上。Go 语言在 reflect 包里定义了各种类型,实现了反射的各种函数,通过它们可以在运行时检测类型的信息、改变类型的值。types 和 interfaceGo 语言中,每个变量都有一个静态类型,在编译阶段就...转载 2020-04-20 21:41:15 · 411 阅读 · 0 评论 -
如何利用反射比较两个对象完全相同
Go 语言中提供了一个函数可以完成此项功能:func DeepEqual(x, y interface{}) boolDeepEqual 函数的参数是两个 interface,实际上也就是可以输入任意类型,输出 true 或者 flase 表示输入的两个变量是否是“深度”相等。先明白一点,如果是不同的类型,即使是底层类型相同,相应的值也相同,那么两者也不是“深度”相等。type MyIn...转载 2020-04-20 19:00:46 · 590 阅读 · 0 评论 -
什么情况下需要使用反射
使用反射的常见场景有以下两种:不能明确接口调用哪个函数,需要根据传入的参数在运行时决定。不能明确传入函数的参数类型,需要在运行时处理任意对象。【引申1】不推荐使用反射的理由有哪些?与反射相关的代码,经常是难以阅读的。在软件工程中,代码可读性也是一个非常重要的指标。Go 语言作为一门静态语言,编码过程中,编译器能提前发现一些类型错误,但是对于反射代码是无能为力的。所以包含反射相关的代...转载 2020-04-18 21:10:22 · 4966 阅读 · 1 评论 -
什么是反射
维基百科上反射的定义:在计算机科学中,反射是指计算机程序在运行时(Run time)可以访问、检测和修改它本身状态或行为的一种能力。用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。难道不用反射就不能在运行时访问、检测和修改它本身的状态和行为吗?问题的回答,其实要首先理解什么叫访问、检测和修改它本身状态或行为,它的本质是什么?实际上,它的本质是程序在运行期探知对象的类...转载 2020-04-18 21:00:46 · 1847 阅读 · 0 评论 -
数组、链表、Hash的优缺点
中文描述1、数组是将元素在内存中连续存放。链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起。2、数组必须事先定义固定的长度,不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。链表动态地进行存储分配,可以适应数据动态地增减的情况。3、(静态)数组从栈中分配空间, 对于程序员方便快速,但是自由度小。链表从堆中分配空间, 自由...原创 2019-06-12 15:17:00 · 2213 阅读 · 0 评论 -
数据结构-栈操作接口定义
原文链接:https://www.goroutine.me/datastructure/2019/06/05/data-structure-stack-interface.html数据结构中的栈基本操作,我这里是也是为了学习记录我自己的书写的代码过程.其中包含取栈的新建,新增元素,删除元素,取指定索引值,向元素尾部追加元素 等等!1、 场景1.1、 中文描述数据结构中的栈基本操作,我这里是...原创 2019-06-12 17:47:03 · 1038 阅读 · 0 评论 -
数据结构-数组操作
原文链接:https://www.goroutine.me/datastructure/2019/06/03/data-structure-array-linked-hash.html数据结构中的数组基本操作,我这里是也是为了学习记录我自己的书写的代码过程.其中包含取数组的新建,新增元素,删除元素,取指定索引值,向元素尾部追加元素 等等!1、 场景1.1、 中文描述数据结构中的数组基本操作...原创 2019-06-12 15:25:11 · 1227 阅读 · 0 评论 -
数据结构-链表操作-单向链表
原文链接:https://www.goroutine.me/datastructure/2019/06/04/data-structure-linkedlist-01.html数据结构中的链表基本操作,我这里是也是为了学习记录我自己的书写的代码过程.其中包含取链表的新建,新增元素,删除元素,取指定索引值,向元素尾部追加元素 等等!1、 场景1.1、 中文描述数据结构中的链表基本操作,我这里...原创 2019-06-12 17:42:05 · 742 阅读 · 0 评论 -
数据结构-栈操作-用数组实现栈基本操作
数据结构中的栈基本操作,我这里是也是为了学习记录我自己的书写的代码过程.其中包含取栈的新建,新增元素,删除元素,取指定索引值,向元素尾部追加元素 等等!1、 场景1.1、 中文描述数据结构中的栈基本操作,我这里是也是为了学习记录我自己的书写的代码过程.其中包含取栈的新建,新增元素,删除元素,取指定索引值,向元素尾部追加元素 等等!2、 代码示例2.1、 基于数组使用栈的操作基于数组使用...原创 2019-06-13 17:56:50 · 1188 阅读 · 0 评论 -
数据结构-栈操作-用链表实现栈基本操作
原文链接:https://www.goroutine.me/datastructure/2019/06/11/data-structure-stack-based-on-linkedlist-01.html数据结构中的栈基本操作,我这里是也是为了学习记录我自己的书写的代码过程.其中包含取栈的新建,新增元素,删除元素,取指定索引值,向元素尾部追加元素 等等!1、 场景1.1、 中文描述数据结...原创 2019-06-13 18:15:07 · 5446 阅读 · 0 评论 -
context.Value 的查找过程是怎样的
type valueCtx struct { Context key, val interface{}}它实现了两个方法:func (c *valueCtx) String() string { return fmt.Sprintf("%v.WithValue(%#v, %#v)", c.Context, c.key, c.val)}func (c *valueCtx) Val...原创 2020-04-18 20:24:44 · 1157 阅读 · 0 评论 -
context 如何被取消
context 包的代码并不长,context.go 文件总共不到 500 行,其中还有很多大段的注释,代码可能也就 200 行左右的样子,是一个非常值得研究的代码库。类型名称作用Context接口定义了 Context 接口的四个方法emptyCtx结构体实现了 Context 接口,它其实是个空的 contextCancelFunc函数取消函数...原创 2020-04-18 19:32:50 · 1075 阅读 · 0 评论 -
context 有什么作用
Go 常用来写后台服务,通常只需要几行代码,就可以搭建一个 http server。在 Go 的 server 里,通常每来一个请求都会启动若干个 goroutine 同时工作:有些去数据库拿数据,有些调用下游接口获取相关数据……这些 goroutine 需要共享这个请求的基本数据,例如登陆的 token,处理请求的最大超时时间(如果超过此值再返回数据,请求方因为超时接收不到)等等。当请求被...原创 2020-04-17 22:21:23 · 1988 阅读 · 0 评论 -
golang context 是什么
Go 1.7 标准库引入 context,中文译作“上下文”,准确说它是 goroutine 的上下文,包含 goroutine 的运行状态、环境、现场等信息。context 主要用来在 goroutine 之间传递上下文信息,包括:取消信号、超时时间、截止时间、k-v 等。随着 context 包的引入,标准库中很多接口因此加上了 context 参数,例如 database/sql 包。c...原创 2020-04-17 22:16:16 · 226 阅读 · 0 评论 -
如何实现字符串和byte切片的零拷贝转换
这是一个非常精典的例子。实现字符串和 bytes 切片之间的转换,要求是 zero-copy。想一下,一般的做法,都需要遍历字符串或 bytes 切片,再挨个赋值。完成这个任务,我们需要了解 slice 和 string 的底层数据结构:type StringHeader struct { Data uintptr Len int}type SliceHeader struct {...转载 2020-04-17 22:03:35 · 633 阅读 · 1 评论 -
如何利用unsafe获取slice&map的长度
获取 slice 长度通过前面关于 slice 的文章,我们知道了 slice header 的结构体定义:// runtime/slice.gotype slice struct { array unsafe.Pointer // 元素指针 len int // 长度 cap int // 容量}调用 make 函数新建一个 slice,底层调用的是...转载 2020-04-17 21:58:12 · 480 阅读 · 0 评论 -
如何利用unsafe包修改私有成员
对于一个结构体,通过 offset 函数可以获取结构体成员的偏移量,进而获取成员的地址,读写该地址的内存,就可以达到改变成员值的目的。这里有一个内存分配相关的事实:结构体会被分配一块连续的内存,结构体的地址也代表了第一个成员的地址。我们来看一个例子:package mainimport ( "fmt" "unsafe")type Programmer struct { nam...转载 2020-04-17 21:50:13 · 427 阅读 · 0 评论 -
面向并发的内存模型
8.26打卡学习记录1.5 面向并发的内存模型在早期,CPU都是以单核的形式顺序执行机器指令。Go语言的祖先C语言正是这种顺序编程语言的代表。顺序编程语言中的顺序是指:所有的指令都是以串行的方式执行,在相同的时刻有且仅有一个CPU在顺序执行程序的指令。随着处理器技术的发展,单核时代以提升处理器频率来提高运行效率的方式遇到了瓶颈,目前各种主流的CPU频率基本被锁定在了3GHZ附近。单核CPU的...转载 2019-08-26 11:54:44 · 191 阅读 · 0 评论 -
函数、方法和接口
8.25打卡学习记录1.4 函数、方法和接口函数对应操作序列,是程序的基本组成元素。Go语言中的函数有具名和匿名之分:具名函数一般对应于包级的函数,是匿名函数的一种特例,当匿名函数引用了外部作用域中的变量时就成了闭包函数,闭包函数是函数式编程语言的核心。方法是绑定到一个具体类型的特殊函数,Go语言中的方法是依托于类型的,必须在编译时静态绑定。接口定义了方法的集合,这些方法依托于运行时的接口对象...转载 2019-08-24 16:50:58 · 9428 阅读 · 1 评论 -
数组、字符串和切片
1.3 数组、字符串和切片在主流的编程语言中数组及其相关的数据结构是使用得最为频繁的,只有在它(们)不能满足时才会考虑链表、hash表(hash表可以看作是数组和链表的混合体)和更复杂的自定义数据结构。Go语言中数组、字符串和切片三者是密切相关的数据结构。这三种数据类型,在底层原始数据有着相同的内存结构,在上层,因为语法的限制而有着不同的行为表现。首先,Go语言的数组是一种值类型,虽然数组的元...转载 2019-08-24 16:42:56 · 3391 阅读 · 0 评论 -
Hello, World 的革命
1.2 Hello, World 的革命在创世纪章节中我们简单介绍了Go语言的演化基因族谱,对其中来自于贝尔实验室的特有并发编程基因做了重点介绍,最后引出了Go语言版的“Hello, World”程序。其实“Hello, World”程序是展示各种语言特性的最好的例子,是通向该语言的一个窗口。这一节我们将沿着各个编程语言演化的时间轴,简单回顾下“Hello, World”程序是如何逐步演化到目前...转载 2019-08-24 16:39:02 · 291 阅读 · 0 评论 -
Go语言创世纪
文章转载于:https://www.goroutine.me/2019/08/19/genesis.htmlGo语言最初由Google公司的Robert Griesemer、Ken Thompson和Rob Pike三个大牛于2007年开始设计发明,设计新语言的最初的洪荒之力来自于对超级复杂的C++11特性的吹捧报告的鄙视,最终的目标是设计网络和多核时代的C语言。到2008年中期,语言的大部分特...转载 2019-08-24 16:31:33 · 526 阅读 · 0 评论