自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(44)
  • 收藏
  • 关注

原创 单链表反转-golang实现

package mainimport ( "fmt")// 链表节点type Node struct { value int next *Node}// 链表type Link struct { head *Node size int}func main() { n1:=&Node{value: 1} n2:=&Node{next: n1,value: 2} n3:=&Node{next: n2,value: 3} n4:=&Node{.

2021-03-03 20:52:55 261 1

转载 go slice 第三个参数是容量

go slice 切片包括左边不包括右边,左包右不包这个例子中 ,2~6 长度len为4,2~7 容量cap为5 s := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} s1 := s[2:5] // [2 3 4] s2 := s1[2:6:7] // [4 5 6 7] fmt.Println(s1, s2, len(s2), cap(s2)) //[2 3 4] [4 5 6 7] 4 5 ...

2021-02-23 22:47:11 1002

转载 Golang的反射reflect深入理解和示例

编程语言中反射的概念在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。每种语言的反射模型都不同,并且有些语言根本不支持反射。Golang语言实现了反射,反射机制就是在运行时动态的调用对象的方法和属性,官方自带的reflect包就是反射相关的,只要包含这个包就可以使用。多插一句,Gol

2021-01-28 11:23:20 297

原创 golang 快速排序-递归

package mainimport ( "fmt" "math")/** * 递归三要素 * 1.找到递归终止时机-》切片长度为1时候 * 2.将问题分解成小粒度(需要满足小粒度的解法和原来一样)-》找一个中间值,然后分成左、右两部分 去分别求解 * 3.明白在单个粒度中需要做什么-》先左、右分布求解,然后合并结果 */func qs(a []int64) []int64 { length := len(a) //尽头条件(停止递归的时机) if length <=.

2021-01-17 00:44:12 270

原创 二叉搜索树 -golang实现

package mainimport ( "fmt" "math")// 二叉树的数据结构type TreeNode struct { Data int Left *TreeNode Right *TreeNode}// 新增节点func (node *TreeNode) Add(v int) { //根节点 if node.Data == math.MinInt64 { node.Data = v return } if v < node.Data.

2021-01-16 22:55:10 93

原创 golang -三数之和为0

package mainimport ( // "fmt" "fmt" "sort")func main() { nums := []int{-1, -1, 2, 0, -2, -2, 4} fmt.Println(threeSum(nums))}func threeSum(nums []int) [][]int { // 先从小到大排序 sort.Ints(nums) // 接收结果 var res [][]int // 获取数组长度 length := len(n.

2021-01-10 21:47:48 176

转载 golang skiplist(跳表)实现

前言首先来了解一下跳表的概念,跳表中的表指的是链表,所以宏观上来看跳表是一种链表结构,那么它与传统的链表有什么不同呢?一般的单链表如果我们需要查找第n个元素,那么就需要从头节点开始一个一个的遍历n次,时间复杂读就是O(n),而跳表就是在单链表之上做了一些优化,使时间复杂度达到O(logn)。在O(logn)复杂度内查找元素,我们不难想到其他的数据结构,avl树,红黑树,b树,b+树之类。但是这些树状结构有个共性就是需要在元素数量发生变化的时候保持平衡才能继续维持性能,所以就需要做一个额外的操作,旋转

2020-12-12 23:58:17 405

转载 彻底弄明白mysql的B+树索引

正确的创建合适的索引,是提升数据库查询性能的基础。在正式讲解之前,对后面举例中使用的表结构先简单看一下:create table user( id bigint not null comment 'id' primary key, name varchar(200) null comment 'name', age bigint null comment 'age', gender int null comment '

2020-11-22 12:28:01 556 1

转载 图解Golang的channel底层原理

此文章转自互联网技术窝废话不多说,直奔主题。channel的整体结构图简单说明:buf是有缓冲的channel所特有的结构,用来存储缓存数据。是个循环链表 sendx和recvx用于记录buf这个循环链表中的~发送或者接收的~index lock是个互斥锁。 recvq和sendq分别是接收(<-channel)或者发送(channel <- xxx)的goroutine抽象出来的结构体(sudog)的队列。是个双向链表源码位于/runtime/chan.go中(目前

2020-10-25 20:09:57 826

转载 Go slice详解

slice表示切片(分片),例如对一个数组进行切片,取出数组中的一部分值。在现代编程语言中,slice(切片)几乎成为一种必备特性,它可以从一个数组(列表)中取出任意长度的子数组(列表),为操作数据结构带来非常大的便利性,如python、perl等都支持对数组的slice操作,甚至perl还支持对hash数据结构的slice。但Go中的slice和这些语言的slice不太一样,前面所说的语言中,slice是一种切片的操作,切片后返回一个新的数据对象。而Go中的slice不仅仅是一种切片动作,还是一种数据

2020-10-25 17:39:36 772 1

原创 golang context的具体使用场景举例-rpc并发调用

rpc调用是在实际开发场景中经常用到的,假设某个用户请求的处理需要3个RPC并行请求,设置一个整体任务的超时时间,如果到达超时时间后,不管RPC有没有执行完毕任务都返回,实现逻辑见下面代码:package mainimport ( "context" "fmt" "strconv" "sync" "time")//rpc调用func Rpc(ctx context.Context, url string) string { result := make(chan string)

2020-09-19 19:15:31 1078

转载 golang的路由数据结构-基数树radix

Radix树Radix树,即基数树,也称压缩前缀树,是一种提供key-value存储查找的数据结构。与Trie不同的是,它对Trie树进行了空间优化,只有一个子节点的中间节点将被压缩。同样的,Radix树的插入、查询、删除操作的时间复杂度都为O(k)。Radix树特点一般由根节点、中间节点和叶子节点组成。 每个节点可以包含一个或多个字符。 树的叶子结点数即是数据条目数。 从根节点到某一节点经过路径的字符连起来即为该节点对应的字符串。 每个节点的所有子节点字符串都不相同。插入操作对r

2020-09-10 16:02:08 775

原创 golang 实现双向链表

package main//链表节点type doublLinkeNode struct { data interface{} //节点存在的数据 pre *doublLinkeNode //指向上一个节点的指针 next *doublLinkeNode //指向下一个节点的指针}//链表数据结构(两个指针 一个指向头节点、一个指向尾节点 便于可以从两边获取数据)type doubleLink struct { head *doublLinkeNode //指向头结点.

2020-08-30 18:49:34 172

原创 hashmap的golang实现

/**** hashMap的golang实现***/package main//桶的格子数const BucketsCount = 20//node节点type Node struct { Next *Node Data Value}//node节点存放的实际对象type Value struct { Key string Value interface{}}//hashMap 桶type HashMap struct { Buckets [Bu...

2020-08-29 23:08:01 886

转载 CIDR地址块及其子网划分(内含原始IP地址分类及其子网划分的介绍)

CIDR地址块及其子网划分(内含原始IP地址分类及其子网划分的介绍)1. 原始的IP地址表示方法及其分类(近几年慢慢淘汰) IP地址是由4字节,32位表示的,为了表示方便,通常用点分十进制表示法,例如大家常见的:192.168.0.52,四个字节,通过点进行分隔,看起来十分清晰。IP地址的32位是由网络号+主机号组成的,也就是说这32位中,左边的某些连续位表示网络号,右边的某些连续位表示主机号,那么我们平常在讨论这一系列问题的时候,会有一个“网络地址”的概念,一般来说网络地址并不等...

2020-08-15 21:47:50 5837 1

转载 谈谈NAT:什么?全球IP和私有IP是什么鬼?

可能你们会经常听到全球 IP(外网)和私有 IP(内网),他们的区别是什么呢?今天这篇文章来简单讲讲这到底是怎么回事。我们都知道,IPv4中的IP地址的数量是有限的,每次把一部分地址分配出去,那么就意味着能够用来分配的IP地址就更少了,而且随着现在手机,电脑等的快速发展,如果每个手机或者电脑都要求一个IP地址,那么显然IP地址是不够用的。为了解决这个问题,我们可以采取这样的策略:例如对于一个公司来说,每个公司都会有一个属于自己公司的内网(也可以称之为局域网)。假如我们给这个公司A分配了一个IP=

2020-08-14 10:54:10 1048 1

转载 golang recover异常捕获容易踩的坑

1.errorGolang被诟病非常多的一点就是缺少强大方便的异常处理机制,大部分高级编程语言,比如Java、PHP、Python等都拥有一种try catch机制,这种异常捕获机制可以非常方便的处理程序运行中可能出现的各种意外情况。严格来说,在Go里面,错误和异常是2种不同的类型,错误一般是指程序产生的逻辑错误,或者意料之中的意外情况,而且异常一般就是panic,比如角标越界、段错误。对于错误,Golang采用了一种非常原始的手段,我们必须手动处理可能产生的每一个错误,一般会把错误返回给调用方

2020-08-13 19:26:27 1469

原创 golang全局变量的坑-尽量别用全局变量

2020-08-11 19:55:31 3343

转载 BT种子的技术原理是什么?就是.torrent文件该如何理解?

看到很多咨询BT种子原理的问题,在这里整理些资料,希望对需要的朋友有帮助。可以分两个层面来分析一下:1、torrent文件的原理:如果这个问题是指torrent文件本身,那么,当你对一个文件(或者文件夹)制作成.torrent文件,实际上生成的.torrent文件里面主要包括了这些信息: A)这个文件(文件夹)中数据的SHA1值,比如一个1G的文件,如果按1M每块进行分块,则会被分为了1000块,torrent中就会有这1000个数据块的指纹值(SHA1的hash值),这个占据了to...

2020-08-11 11:10:20 832

转载 如何理解虚拟内存

为什么不直接使用物理内存虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。现代所有用于一般应用的操作系统都对普通的应用程序使用虚拟内存技术,老一些的操作系统,如DOS和1980年代的Windows,或者那些1960年代的大型机,一般都没有虚拟内存的功能——维基百科读完上面的信息,我们可以得知,虚拟内存这个概念是后来才提出的,一开始并没...

2020-08-09 19:40:01 143

原创 golang context学习笔记

package mainimport ( "context" "fmt" "sync")var wg sync.WaitGroupfunc main() { wg.Add(2) ctx, cancel := context.WithCancel(context.Background()) go dosth(ctx, 1, &wg) go dosth(ctx, 2, &wg) cancel() wg.Wait()}func dosth(ctx conte.

2020-07-25 09:54:58 154

原创 golang struct中嵌入interface

只要任意结构是这个interface的实现,都可以当作这个struct的元素

2020-07-24 19:23:14 817

转载 深入理解Golang之context

前言这篇文章将介绍Golang并发编程中常用到一种编程模式:context。本文将从为什么需要context出发,深入了解context的实现原理,以及了解如何使用context。为什么需要context在并发程序中,由于超时、取消操作或者一些异常情况,往往需要进行抢占操作或者中断后续操作。熟悉channel的朋友应该都见过使用done channel来处理此类问题。比如以下这个例子:func main() { messages := make(chan int, 10)

2020-07-21 15:23:41 147

原创 golang定时器

package mainimport ( "fmt" "sync" "time")/***ticker只要定义完成,从此刻开始计时,不需要任何其他的操作,每隔固定时间都会触发。*timer定时器,是到固定时间后会执行一次*如果timer定时器要每隔间隔的时间执行,实现ticker的效果,使用 func (t *Timer) Reset(d Duration) bool */func main() { var wg ...

2020-07-21 14:46:32 148

转载 Golang Context

最近实现系统的分布式日志与事务管理时,在寻求所谓的全局唯一Goroutine ID无果之后,决定还是简单利用Context机制实现了基本的想法,不够高明,但是好用。于是对它当初的设计比较好奇,便有了此文。1、What ContextContext是Golang官方定义的一个package,它定义了Context类型,里面包含了Deadline/Done/Err方法以及绑定到Context上的成员变量值Value,具体定义如下:type Context interface { // 返回

2020-06-07 23:22:50 142

转载 Golang Http Server源码阅读

这篇文章出现的理由是业务上需要创建一个Web Server。创建web是所有语言出现必须实现的功能之一了。在nginx+fastcgi+php广为使用的今天,这里我们不妨使用Go来进行web服务器的搭建。前言使用Go搭建Web服务器的包有很多,大致有下面几种方法,直接使用net包,使用net.http包,使用第三方包(比如gorilla)。使用net包就需要从tcp层开始封装,耗费人力物力极大,果断舍弃。直接使用封装好的net.http和第三方包才是上策。这里我们就选择了使用官方提供的net.htt

2020-06-07 19:48:50 130

转载 Golang中的方法集与方法调用问题

问题提要之前写代码的时候遇到了一个问题:自己编写了一个接口,然后又写了一个结构体实现这个接口,在通过函数调用接口方法时出现了问题。代码如下:type Validator interface { Valid() bool}type LoginInput struct { Username string Password string}func (input *LoginInput) Valid() bool { // 一些检验逻辑 // 返回校验结果}fun

2020-06-05 13:15:24 736

原创 golang 笔记:import的后面是路径名还是包名

直接看代码测试://调用方package mainimport (    "fmt"    "test")var ts TStructtype TStruct struct {    Name string    Age  int}func (ts TStruct) Print() {    fmt.Println("Name:", ts.Name)    ...

2018-10-31 20:43:55 7133

转载 Golang的反射reflect深入理解和示例

链接:https://studygolang.com/articles/12348?fr=sidebar 编程语言中反射的概念在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语...

2018-08-28 21:40:47 245

转载 通过例子理解事务的4种隔离级别

第1级别:Read Uncommitted(读取未提交内容) 第2级别:Read Committed(读取提交内容) 第3级别:Repeatable Read(可重读) 第4级别:Serializable(可串行化) 参考文章 SQL标准定义了4种隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系...

2018-08-16 20:20:00 330

原创 Yii2的RBAC实现原理详解

一.简介:RBAC(Role-Based Access Control )基于角色的访问控制。1.基本思想:在用户和访问权限之间引入角色的概念,将用户和角色联系起来,通过对角色的授权来控制用户对系统资源的访问,相对传统访问控制 引入角色极大地简化了权限的管理。1).角色:可以理解为一定数量的权限的集合,权限的载体。例如:一个论坛系统,“超级管理员”、“版主”都是角色。2).权限:版...

2018-08-11 16:53:38 5341 1

原创 golang之直接插入排序

package mainimport (    "fmt")func main() {    var array = []int{50, 2, 45, 42, 6, 47, 23, 22, 15, 456, 15, 11, 30, 16, 13, 3}    length := len(array)    var j int    //外循环:有多少个元素没有进行排序就循环多少...

2018-08-08 21:41:57 220

原创 golang之查找算法-待完善

package mainimport (    "fmt")func main() {    var array = []int{3, 5, 2, 89, 65, 65, 887, 345}    index := traveSearch(array, 89)    fmt.Println(index)    var array2 = []int{3, 5, 65, 887,...

2018-08-05 22:35:07 364

转载 数据库连接池原理

 这次我们采取技术演进的方式来谈谈数据库连接池的技术出现过程及其原理,以及当下最流行的开源数据库连接池jar包。一.早期我们怎么进行数据库操作       1.原理:一般来说,java应用程序访问数据库的过程是:   ①装载数据库驱动程序;   ②通过jdbc建立数据库连接;   ③访问数据库,执行sql语句;   ④断开数据库连接。       2.代码         // 查询所有用户[ja...

2018-05-03 19:12:13 2314 1

转载 一篇挺好的rabbit应用场景及原理介绍

直接贴链接:https://blog.csdn.net/whoamiyang/article/details/54954780

2018-05-02 15:02:46 265

翻译 golang channel多生产者和多消费者实例

package mainimport (  "fmt"  "time")func consumer(cname string, ch chan int) {        //可以循环 for i := range ch 来不断从 channel 接收值,直到它被关闭。 for i := range ch { fmt.Println("consumer-----------", cname, "...

2018-04-29 16:09:54 11361

转载 啥是单点登录及单点登录原理

一、单系统登录机制1、http无状态协议  web应用采用browser/server架构,http作为通信协议。http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关联,这个过程用下图说明,三次请求/响应对之间没有任何联系  但这也同时意味着,任何用户都能通过浏览器访问服务器资源,如果想保护服务器的某些资源,必须限制浏览器请求;要限制浏览器请求,必须鉴别浏览器请求...

2018-04-04 16:10:58 491 1

转载 【mysql】SQL嵌套子查询和相关子查询的执行过程有什么区别(推荐)

SQLServer子查询可以分为 相关子查询 和 嵌套子查询 两类。前提,假设Books表如下:类编号 图书名 出版社 价格--------------------------------------------------------2 c#高级应用 圣通出版 23.002 Jsp开发应用 机

2017-02-23 19:52:55 726

转载 PHP实现四种基本排序算法

前提:分别用冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中的值按照从小到大的顺序进行排序。 $arr(1,43,54,62,21,66,32,78,36,76,39); 1. 冒泡排序思路分析:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即,每当两相邻的数比较后发现它们的排序与排序要求相反时

2017-02-06 14:03:56 238

原创 php之汉诺塔递归算法分析和实现

php之汉诺塔递归算法分析和实现

2016-12-31 14:41:23 2016 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除