自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Golang标准库-strconv 字符串转换

package mainimport ( "fmt" "strconv")func main() { /*****Format系列(其它类型转字符串)*****/ //bool转字符串 fmt.Println(strconv.FormatBool(true)) //'f'指打印格式以小数方式,3:指小数位数,64:指float64处理 fmt.Println(strconv.FormatFloat(2.12,'f',3,64)) //

2021-01-17 20:48:58 254

原创 Golang标准库-strings 字符串操作

字符串处理字符串在开发中经常用到,包括用户输入,数据库读取数据,我们经常需要对字符串进行分割,连接,转换的等操作字符串操作前缀和后缀HasPrefix判断字符串是否以prefix开头函数签名strings.HasPrefix(s,prefix string)boolHasSuffix判断字符串s是否以suffix结尾:函数签名strings.HasSuffix(s,suffix string)bool栗子:package mainimport ( "fmt" "s

2021-01-15 23:44:23 405

原创 Golang标准库-Time 时间操作大全

平时开发过程中,时间相关的操作用的还是很多的。接下来就与大家一起总结下与时间有关的操作,主要涉及到 time 包,核心数据结构是 time.Time,如下:type Time struct { wall uint64 ext int64 loc *Location}1.获取时间相关函数获取当前时间// 返回当前时间,注意此时返回的是 time.Time 类型now := time.Now()fmt.Println(now)// 当前时间戳fmt.Println(

2021-01-14 00:07:58 2362

原创 Go中三种排序:排序整数、浮点数和字符串切片,使用自定义比较器排序,排序任意数据结构

排序整数、浮点数和字符串切片对于[]int ,[]float.[]string这种元素类型时基础类型的切片使用sort包提供了下面几个函数进行排序:sort.Intssort.Floatssort.Stringss := []int{4, 2, 3, 1}sort.Ints(s)fmt.Println(s) // 输出[1 2 3 4]使用自定义比较器排序使用sort.Slice函数排序,它使用一个用户提供的函数来对序列进行排序,函数类型为func(i, j int) bool,其

2020-12-21 10:58:53 764

原创 Golang 切片类型的接口存储多层嵌套Map对象,如何初始化,又如何直接读取嵌套层的key-value值

package mainimport ( "fmt" "reflect")func main() { //定义一个接口类型的切片 in := make([]interface{}, 3) m1 := make(map[string]string) m2 := make(map[string][]byte) //初始化键值对 m1 = map[string]string{ "teleplay1": "情定大饭店", "teleplay2": "天国的阶梯", "tel

2020-12-19 18:55:05 870 1

原创 Go Map初始化方式及Map的多层嵌套

package mainimport ( "fmt")func main() { //多维map的声明与实现 //方法1:初始化一个空的多维映射 mainMapA :=map[string]map[string]string{} subMapA :=map[string]string{"A_Key_1":"A_SubValue_1","A_key_2":"A_SubValue_2"} mainMapA["MapA"] =subMapA fmt.Println("\nMultit

2020-12-19 17:21:23 3527 1

原创 Go 切片类型的结构体进行json序列化与反序列化

思路:一个json对象就是一个结构体一个json数组就是一个切片json数组放json对象就是切片里面放结构体{ "order_id":"2019070721318", "order_price":26.87, "goods":[ { "goods_name":"手机", "goods_price":23.9, "goods_coloer":[

2020-12-19 14:37:18 695 1

原创 Go 切片类型的Map进行json序列化与反序列化

思路:一个json对象就是一个map一个json数组就是一个切片json数组放对象就是相当于切片里面放map{ "good":[ { "good_name":"手机", "good_price":23.1, "goods_color":[ { "good_color":"粉红色", "g

2020-12-19 12:13:29 1798 1

原创 go语言中字段序列化与反序列化的总结

一、概括JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,现在是主流的数据格式常用于web开发中前端与后端进行数据交换的一中方式二、在go中常见的几种序列化成json的方式1、将结构体序列化成jsonpackage mainimport ( "encoding/json" "fmt")type Student struct { Name string `json:"name"` // 姓名 Age

2020-12-18 11:45:26 507

原创 详解Go中匿名函数,闭包函数,回调函数

匿名函数匿名函数没有函数名,只有函数体,函数可以被作为一种类型被赋值给变量,匿名函数也往往以变量的方式被传递。匿名函数经常被用于实现回调函数、闭包等。定义格式如下:func(参数列表)(返回参数列表){ //函数体}方式一:在定义时调用匿名函数func anonymousFunc1() { func(data int) { fmt.Println("hello", data) }(100)}这里的100是匿名函数的参数方式二:将匿名函数赋值给变量

2020-12-17 15:46:28 439

原创 golang语言中struct的初始化方式

方法一:通过var声明结构体var t T系统会自动初始化它的默认值,比如int初始化为0.指针初始化为nil,同样也会为结构体类型数据分配内存,此时类型为T方法二:通过new或&进行声明(new和&初始化方式相同)t := new(T)// 先定义结构体type Rect struct { width int height int}// 再初始化结构体rect1 := new(Rect)rect2 := &Rect{}rect3 := &a

2020-12-16 16:17:37 4945

转载 map赋值前要先初始化:assignment to entry in nil map

注意这种map的嵌套的形式,make只初始化了map[string]T部分(T为map[int]int),所以下面的赋值会出现错误:test := make(map[string]map[int]int)test["go"][0] = 0 // error正确的做法:test := make(map[string]map[int]int)test["go"] = make(map[int]int)test["go"][0] = 0一个常用的做法:test := make(map[stri

2020-12-08 13:08:08 667

原创 遍历值为结构体类型的Map并append到切片类型的结构体中

package mainimport "fmt"type NotknownType struct { S1 string S2 string S3 string}func main() { a1 :=NotknownType{S3: "nnn",S2: "bbb",S1: "ccc"} a2 :=NotknownType{S3: "nnn",S2: "bbb",S1: "ccc"} a3 :=NotknownType{S3: "nnn",S2: "bbb",S1: "ccc.

2020-12-06 01:56:34 472

原创 解决:git SSL certificate problem: unable to get local issuer certificate

错误: git SSL certificate problem: unable to get local issuer certificate这个问题是由于没有配置信任的服务器HTTPS验证。默认,cURL被设为不信任任何CAs,就是说,它不信任任何服务器验证。只需要执行下面命令就可以解决:git config --global http.sslVerify false...

2020-11-21 15:58:11 66736 51

原创 Git 标签

如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag 给它打上标签。比如说,我们想为我们的 runoob 项目发布一个"1.0"版本。 我们可以用 git tag -a v1.0 命令给最新一次提交打上(HEAD)"v1.0"的标签。-a 选项意为"创建一个带注解的标签"。 不用 -a 选项也可以执行的,但它不会记录这标签是啥时候打的,谁打的,也不会让你添加个标签的注解。 我推荐一直创建带注解的标签。$ git tag -a v1.0 当你执行 git t

2020-11-17 19:12:33 107

原创 Git 查看提交历史

Git 提交历史一般常用两个命令:git log - 查看历史提交记录。git blame - 以列表形式查看指定文件的历史修改记录。git log在使用 Git 提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,我们可以使用 git log 命令查看。针对我们前一章节的操作,使用 git log 命令列出历史提交记录如下:$ git logcommit d5e9fc2c811e0ca2b2d28506ef7dc14171a207d9 (HEAD -> master)M

2020-11-17 19:00:47 814

原创 Git 分支管理

几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。创建分支的命令:git branch (branchname)切换分支命令:git checkout (branchname)当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。合并分支命令:git merge 你可以多次合并到统一分支, 也可以选择在合并之后直接删除被并入的分支。开始前我们先创建一个.

2020-11-17 18:45:34 142

原创 Git的基本操作

Git的工作就是创建和保存你项目的快照以及与之后的快照进行对比。Git常用的是以下6个命令:git clone ,git push,git commit,git checkout,git pull说明:workspace:工作区stagingarea:暂存区/缓存区local repositury:本地创库rempte repository:远程创库一个简单的操作步骤:$ git init $ git add . $ git commit git i.

2020-11-17 14:01:44 112

原创 Git 创建仓库

git initGit使用git init 命令来初始化一个Git创库,Git的很多命令都需要在Git的创库中运行,所以git init是使用Git的第一个命令。在执行完成git init命令后,Git会生成一个.git的目录,该目录包含了资源的所有元数据,其他的项目保持不变git init 的功能为初始化一个文件夹为本地仓库,首先我们新建并进入demo:然后执行git init然后使用git status查看状态和是否存在.git文件初始化仓库成功。新建文件并添加进暂存区仓库分为

2020-11-17 12:41:51 160

原创 Git工作流程

一般工作流程如下克隆Git资源作为工作目录在克隆资源上添加或修改文件如果其他人修改了,你可以更新资源在提交前查看修改提交修改在修改完成后,如果发现错误,可以撤回提交并再次修改提交...

2020-11-17 11:58:10 151

原创 GitLab的安装及使用教程

摘要: GitLab是利用Ruby on Rails一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目,与Github类似。本篇教程将教你如何安装部署及使用GitLab。GitLab基本介绍GitLab是利用Ruby on Rails一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。与Github类似,GitLab能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并.

2020-11-17 00:25:25 497

原创 Git配置本地SSH密钥

首先需要已经在电脑上安装git,步骤参考网上即可。桌面上右键鼠标打开“Git Bash Here”键入命令:ssh-keygen -t rsa -C "***@126.com" 。"***@126.com"是gitlab邮箱提醒你输入key的名称,输入id_rsa在C:\Users\Administrator\.ssh下产生两个文件:id_rsa和id_rsa.pub如果找不到的话请到桌面上找,找到之后将两个文件拷贝到C:\Users\Administrator\.ssh目录下即可用编辑器打开

2020-11-16 23:45:51 1879

原创 go 语言实现二叉树 前序遍历 中序遍历 后序遍历

树的定义树(Tree) 是 n(n>=0) 个结点的有限集, n=0 时称为空树, 在任意一颗非空树当中,有且只有一个特定的称为根(Root) 的结点当n>1时, 其余结点可分为 m(m>0) 个互不相交的优先集 T1 T2 … Tm, 其余每一个集合本身又是一棵树, 并且称为根的子树 (SubTree)特别强调两点 :n>0时, 根节点是位移的, 不可能存在多个根节点当m>0时, 子树的个数并没有限制, 但他们一定是互不相交的, 像下图的两个结构就不符

2020-11-13 23:19:46 750

原创 go包管理发展历史

下面是官方的包管理工具的发展历史:在 1.5 版本之前,所有的依赖包都是存放在 GOPATH 下,没有版本控制。这个类似 Google 使用单一仓库来管理代码的方式。这种方式的最大的弊端就是无法实现包的多版本控制,比如项目 A 和项目 B 依赖于不同版本的 package,如果 package 没有做到完全的向前兼容,往往会导致一些问题。1.5 版本推出了 vendor 机制。所谓 vendor 机制,就是每个项目的根目录下可以有一个 vendor 目录,里面存放了该项目的依赖的 package。g

2020-11-12 20:01:37 426

原创 深入解读go语言之反射reflect

反射的概念反射机制就是运行时动态的调用对象的方法和属性。interface和反射在讲反射之前,先来看看Golang关于类型设计的一些原则变量包括(type,value)两部分理解这一点就知道为什么nil !=nil了type 包括static type 和 concrete(具体的,确定的) type。简单来说 static type 是你在编码时看见的类型如(int string) ,concrete type 是runtime系统看见的类型类型断言能否成功,取决于变量的co

2020-11-11 19:30:04 400

原创 数据结构——HashMap

HahsMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry(入口)这些键值对(Entry)分散在一个数组中,这个数组就是HashMap的主干HahsMap数组每一个元素初始值都是Null对于HashMap,我们最常用的方法:Get和PutPut方法的原理:调用 Put 方法的时候发生了什么呢?比如调用 hashMap.put(“apple”, 0) ,插入一个Key为“apple”的元素。这时候我们需要利用一个哈希函数来确定Entry的插入位置(index):.

2020-11-09 00:00:34 701

原创 hash表解析

概念hash表是一种以键值对(key-indexd)存储数据的结构,我们只要输入待查找的值即key,就可以查找到其对应的值哈希的思路很简单,如果所有的键都是整数,那么就可以使用一个简单的无序数组来实现:将键作为索引,值即为其对应的值,这样就可以快速的访问任意键的值,这是对于简单键的情况,我们将其扩展到可以处理更加复杂的类型键数组的特点是:寻址容易,插入和删除困难链表的特点是:寻址困难,插入哈删除容易左边很明显是个数组,数组的每个成员包括一个指针,指向一个链表头,当然这个链表可能为

2020-11-08 22:21:48 205

原创 平衡二叉树、B树、B+树、B*树 理解其中一种你就都明白了

平衡二叉树概念平衡二叉树是基于二分法的策略提高查找速度的二叉树的数据结构特点:平衡二叉树采用的是二分法的思维把数据按规则组装成一个树形的数据,用这个树形结构的数据减少无关数据的检索,大大的提升了数据检索的速度;平衡二叉树的数据结构组装过程有以下规则:1.非叶子节点只能允许最多两个节点存在2.每个非叶子节点数据分布规则为左边的子节点小于当前的节点值,右边的子节点大于当前节点值(这里的值基于自己的算法规则而定,比如hash值)平衡树的层级结构:因为平衡树查询性能和树的层级(h

2020-11-08 15:53:30 500

原创 深入解读go语言之 排序:sort

首先看一下sort包的原理func Sort(data Interface) { // Switch to heapsort if depth of 2*ceil(lg(n+1)) is reached. n := data.Len() maxDepth := 0 for i := n; i > 0; i >>= 1 { maxDepth++ } maxDepth *= 2 quickSort(data, 0, .

2020-11-07 18:05:35 441

原创 go实现集合set

支持任意类型添加package mainimport ( "fmt" "sync")type inter interface {}type Set struct { m map[inter]bool sync.RWMutex}func New() *Set { return &Set{ m : map[inter]bool{}, }}func (s *Set)Add(itme inter) { s.Lock() defer s.Unlock().

2020-11-07 16:30:53 711

原创 并发之协程池

提供一个 go routine 池,每个 go routine 循环阻塞等待从任务池中执行任务;外界使用者不断的往任务池里丢任务,则 go routine 池中的多个 go routine 会并发的处理这些任务一、worker/workPool.gopackage workerimport ( "sync")type Worker interface { Task()}type Pool struct { wg sync.WaitGroup //工作池 taskPool c.

2020-11-06 22:56:41 781 1

原创 go类型断言

类型断言就是将接口类型的值(x),转换成类型(T)。格式为:x.(T);类型断言的必要条件就x是接口类型,非接口类型的x不能做类型断言;T可以是非接口类型,如果想断言合法,则T必须实现x的接口;T也可以是接口,则x的动态类型也应该是接口T;类型断言如果非法,运行时会导致错误,为了避免这种错误,应该总是使用下面的方式来进行类型断言package mainimport ( "fmt")func main() { var x interface{} x =100 value1,o.

2020-11-06 15:44:24 4973

原创 go struct{} 空结构体的特点和作用

参考代码package mainimport ( "fmt" "unsafe")func main() { s := struct {}{} s1 := struct {}{} fmt.Println("空结构体内存使用情况",unsafe.Sizeof(s)) fmt.Printf("空结构体指针使用情况:s =%p,s1=%p,两个指针比较结果%v",&s,&s1,&s==&s1) strChan :=make(chan string,3).

2020-11-06 13:10:48 662

原创 slice 初始化和未初始化的区别

slice初始化和为初始化初始化为赋值之前是空气片为初始化为nil不能赋值//未初始化的slicepackage mainimport ( "fmt")func main() { // 可以使用 var s []string s = append(s, "a") fmt.Println(s)}s[0] = “a” 会报错这个是append内部实现了slice的自增,内部进行了make初始化。每次对slice的操作内部会产生一个新的数组,然后

2020-11-06 01:55:18 1467

原创 如何优雅的关闭Go Channel

Channel关闭原则不要再消费端关闭channel,不要在有多个并行的生产者时对Channel执行关闭操作也就是说应该只在[唯一的或者最后唯一剩下的]生产者协程中关闭channel,来通知消费者已经没有值可以继续读了。暴力的关闭channel正确方法如果想要在消费端关闭channel,或者在多个生产者端关闭channel,可以使用recover机制来上个保险,避免程序因为panic崩溃。消费端关闭package mainimport "fmt"func main() { //va

2020-11-04 21:55:41 715

原创 SQL复合索引使用和注意事项

单一索引单一索引是指索引为一列的情况,即新建索引的语句只实施在一列上复合索引用户可以在多列上新建索引,这种索引叫复合索引(组合索引)复合索引在数据库操作期间的开销更小,可以替代多个单一索引同时有两个概念叫做窄索引和宽索引:窄索引是指索引为1-2列的索引宽索引也就是索引超过2列的索引设计索引的一个重要原则就是能用窄索引不用宽索引,因为窄索引往往比组合索引更有效使用创建复合索引CREATE INDEX index_name ON tablel(clo1,clo2,clo3)

2020-11-03 23:09:35 1025

原创 深度解密Go语言之map

什么是map是由一组<key,value>对组成的数据结构,并且同一个key只能出现一次有map相关的操作主要是增加一个k-v对------Add or insert删除一个k-v对------Remover or delete修改某个k对应的v------Reassign查询某个k对应的v------Lookupmap的设计也称为The dictionary problem,它的任务是设计一种数据结构用来维护一个集合的数据,并且可以同时对集合进行增删改查的操作。最主要的

2020-11-01 03:11:36 1023 5

原创 深度解密Go语言之Slice

什么是sliceslice 翻译成中文就是切片,它和数组(array)很类似,可以用下标的方式进行访问,如果越界,就会产生panic。但是它比数组更灵活,可以自动地进行扩容源码://runtime/slice.gotype slice struct{array unsafe.Pointer //元素指针len int //长度cap int //容量}看到了吗,slice共有是哪个属性;指针,指向底层数组;长度,表示切片可用元素的个数,也就是使用下标对slice的元素进行访问时下标

2020-11-01 00:12:09 373

原创 Go中链表的实现

数组和链表的优缺点链表和数组是两种基本的数据结构,两种结构都是用来存储一系列的数据。数组的优点:方便遍历查找需要的数据。在查询数组指定位置(如查询数组中第4个数据)在操作中,只需要进行1次操作即可,时间复杂度为o(1)。数组的缺点:因为数组在内存中占用了连续的空间,在进行类似的查找和遍历时,本质是指针在内存中的定向偏移。然而,当需要对数组成员进行添加和删除的操作时,数组内完成这类操作的时间复杂度则变成了O(n)链表的优点:当进行插入和删除操作时,链表操作的时间复杂度仅为O(1).另外,因

2020-10-31 14:06:40 493

原创 Go堆栈的理解

什么是堆栈?在计算机中堆栈的概念分为:数据结构的堆栈和内存分配中的堆栈。数据结构的堆和栈:堆:堆可以看成是一颗树,如:堆排序。在队列中,调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样具有优先权。堆即为解决此类问题设计的一种数据结构。通俗理解:堆像一颗倒过来的树。,堆是一种经过排序的树形结构。每一个节点都有一个值。通常我们所说的堆的数据结构,是指二叉堆。堆的特点是根节点的值最小(或最大)。且根节点的

2020-10-31 10:19:40 890 1

空空如也

空空如也

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

TA关注的人

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