- 博客(35)
- 收藏
- 关注
原创 GC_Golang
GC(garbage cycle)垃圾回收机制,是用于对申请的内存进行回收,防止内存泄露等问题的一种机制。go的GC机制调用方式所在位置代码定时调用runtime/proc.go:forcegchelper()gcStart(gcTrigger{kind: gcTriggerTime, now: nanotime()})分配内测时调用runtime/malloc.go:mallocgc()gcTrigger{kind: gcTriggerHeap}手动调用ru
2021-07-20 10:47:56
231
原创 uintptr和unsafe.Pointer的区别吗?
怎么答unsafe.Pointer只是单纯的通用指针类型,用于转换不同类型指针,它不可以参与指针运算;而uintptr是用于指针运算的,GC 不把 uintptr 当指针,也就是说 uintptr 无法持有对象, uintptr 类型的目标会被回收;unsafe.Pointer 可以和 普通指针 进行相互转换;unsafe.Pointer 可以和 uintptr 进行相互转换。举例通过一个例子加深理解,接下来尝试用指针的方式给结构体赋值。package mainimport ( "fmt
2021-05-24 10:26:39
226
原创 字符串转成byte数组,会发生内存拷贝吗?
怎么答字符串转成切片,会产生拷贝。严格来说,只要是发生类型强转都会发生内存拷贝。那么问题来了。频繁的内存拷贝操作听起来对性能不大友好。有没有什么办法可以在字符串转成切片的时候不用发生拷贝呢?代码实现package mainimport ( "fmt" "reflect" "unsafe")func main() { a :="aaa" ssh := *(*reflect.StringHeader)(unsafe.Pointer(&a)) b := *(*[]byte)(
2021-05-24 09:51:12
439
原创 13.回溯法
回溯法背景回溯法(backtrack)常用于遍历列表所有子集,是 DFS 深度搜索一种,一般用于全排列,穷尽所有可能,遍历的过程实际上是一个决策树的遍历过程。时间复杂度一般 O(N!),它不像动态规划存在重叠子问题可以优化,回溯算法就是纯暴力穷举,复杂度一般都很高。模板result = []func backtrack(选择列表,路径): if 满足结束条件: result.add(路径) return for 选择 in 选择列表:
2021-05-17 09:25:59
165
原创 12.二叉搜索树
二叉搜索树定义每个节点中的值必须大于(或等于)存储在其左侧子树中的任何值。每个节点中的值必须小于(或等于)存储在其右子树中的任何值。应用validate-binary-search-tree验证二叉搜索树/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */func i
2021-05-17 09:25:23
133
原创 11.滑动窗口思想
滑动窗口思想模板/* 滑动窗口算法框架 */void slidingWindow(string s, string t) { unordered_map<char, int> need, window; for (char c : t) need[c]++; int left = 0, right = 0; int valid = 0; while (right < s.size()) { // c 是将移入窗口的字符
2021-05-17 09:24:41
161
原创 10.递归思维
递归思维介绍将大问题转化为小问题,通过递归依次解决各个小问题示例reverse-string编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。func reverseString(s []byte) { res := make([]byte, 0) reverse(s, 0, &res) for i := 0; i < len(s); i++ { s[i] = res[i] }}fu
2021-05-16 19:44:52
308
原创 9.动态规划
动态规划背景先从一道题目开始~如题 triangle给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。例如,给定三角形:[ [2], [3,4], [6,5,7], [4,1,8,3]]自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。使用 DFS(遍历 或者 分治法)遍历image.png分治法image.png优化 DFS,缓存已经被计算的值(称为:记忆化搜索 本质上:动态规划)i
2021-05-16 19:44:11
177
原创 8.排序算法
排序算法常考排序快速排序func QuickSort(nums []int) []int { // 思路:把一个数组分为左右两段,左段小于右段 quickSort(nums, 0, len(nums)-1) return nums}// 原地交换,所以传入交换索引func quickSort(nums []int, start, end int) { if start < end { // 分治法:divide pivot
2021-05-16 19:43:30
112
原创 7.二分搜索
二分搜索二分搜索模板给一个有序数组和目标值,找第一次/最后一次/任何一次出现的索引,如果没有出现返回-1模板四点要素1、初始化:start=0、end=len-12、循环退出条件:start + 1 < end3、比较中点和目标值:A[mid] ==、 <、> target4、判断最后两个元素是否符合:A[start]、A[end] ? target时间复杂度 O(logn),使用场景一般是有序数组的查找典型示例binary-search给定一个 n 个元素有序
2021-05-16 19:42:40
124
原创 6.二进制
二进制常见二进制操作基本操作a=0a=a00=a^a由上面两个推导出:a=abb交换两个数a=a^bb=a^ba=a^b移除最后一个 1a=n&(n-1)获取最后一个 1diff=(n&(n-1))^n常见题目single-number给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。func singleNumber(nums []int) int { // 10 ^10 == 00
2021-05-16 19:41:38
154
原创 5.栈和队列
栈和队列简介栈的特点是后入先出image.png根据这个特点可以临时保存一些数据,之后用到依次再弹出来,常用于 DFS 深度搜索队列一般常用于 BFS 广度搜索,类似一层一层的搜索Stack 栈min-stack设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。思路:用两个栈实现,一个最小栈始终保证最小值在顶部type MinStack struct { min []int stack []int}/** initialize
2021-05-16 19:40:58
116
原创 4.链表
链表基本技能链表相关的核心点null/nil 异常处理dummy node 哑巴节点快慢指针插入一个节点到排序链表从一个链表中移除一个节点翻转链表合并两个链表找到链表的中间节点常见题型remove-duplicates-from-sorted-list给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。func deleteDuplicates(head *ListNode) *ListNode { current := head for cur
2021-05-16 19:40:21
136
原创 3.二叉树
二叉树知识点二叉树遍历前序遍历:先访问根节点,再前序遍历左子树,再前序遍历右子树 中序遍历:先中序遍历左子树,再访问根节点,再中序遍历右子树 后序遍历:先后序遍历左子树,再后序遍历右子树,再访问根节点注意点以根访问顺序决定是什么遍历左子树都是优先右子树前序递归func preorderTraversal(root *TreeNode) { if root==nil{ return } // 先访问根再访问左右 fmt.Println(ro
2021-05-16 19:39:46
126
原创 2.算法快速入门
算法快速入门数据结构与算法数据结构是一种数据的表现形式,如链表、二叉树、栈、队列等都是内存中一段数据表现的形式。 算法是一种通用的解决问题的模板或者思路,大部分数据结构都有一套通用的算法模板,所以掌握这些通用的算法模板即可解决各种算法问题。后面会分专题讲解各种数据结构、基本的算法模板、和一些高级算法模板,每一个专题都有一些经典练习题,完成所有练习的题后,你对数据结构和算法会有新的收获和体会。先介绍两个算法题,试试感觉~示例 1strStr给定一个 haystack 字符串和一个 needle
2021-05-16 19:35:30
192
原创 1.go 语言入门
go 语言入门基本语法Go 语言圣经常用库切片go 通过切片模拟栈和队列栈// 创建栈stack:=make([]int,0)// push压入stack=append(stack,10)// pop弹出v:=stack[len(stack)-1]stack=stack[:len(stack)-1]// 检查栈空len(stack)==0队列// 创建队列queue:=make([]int,0)// enqueue入队queue=append(queue,10)/
2021-05-16 19:34:43
198
原创 GMP有哪些状态
G (goroutine)G是goroutine的头文字, goroutine可以解释为受管理的轻量线程, goroutine使用go关键词创建.举例来说, func main() { go other() }, 这段代码创建了两个goroutine,一个是main, 另一个是other, 注意main本身也是一个goroutine.goroutine的新建, 休眠, 恢复, 停止都受到go运行时的管理.goroutine执行异步操作时会进入休眠状态, 待操作完成后再恢复, 无需占用系统线程,g
2021-05-11 09:34:38
730
原创 Golang如何实现并发
假如我们有一个G(Goroutine1)已经通过P被安排到了一个M上正在执行,在Goroutine1执行的过程中我们又创建两个G,这两个G会被马上放入与Goroutine1相同的P的本地G任务队列中,排队等待与该P绑定的M的执行,这是最基本的结构,很好理解。关键问题是:如何在一个多核心系统上尽量合理分配G到多个M上运行,充分利用多核,提高并发能力呢?如果我们在一个Goroutine中通过go关键字创建了大量G,这些G虽然暂时会被放在同一个队列,但如果这时还有空闲P(系统内P的数量默认等于系.
2021-05-10 14:02:13
346
转载 MySQL数据库-基础知识
说说主键、外键、超键、候选键的差别并举例超键(super key): 在关系中能唯一标识元组的属性集称为关系模式的超键。 候选键(candidate key):不含有多余属性的超键称为候选键。也就是在候选键中,若再删除属性,就不是键了! 主键(primary key):用户选作元组标识的一个候选键程序主键。 外键(foreign key):如果关系模式R中属性K是其它模式的主键,那么k在模式R中称为外键。举个例子,对于 学生信息(学号 身份证号 性别 年龄 身高 体重 宿舍号)和 宿舍信息(宿.
2021-05-10 13:52:04
279
原创 Golang_微服务_Protobuf
一、Protobuf简介1.1、RPC 通信对于单独部署,独立运行的微服务实例而言,在业务需要时,需要与其他服务进行通信,这种通信方式是进程之间的通讯方式(inter-process communication,简称IPC)。前文已经描述过,IPC有两种实现方式,分别为:同步过程调用、异步消息调用。在同步过程调用的具体实现中,有一种实现方式为RPC通信方式,远程过程调用(英语:Remote Procedure Call,缩写为 RPC)。远程过程调用(英语:Remote Procedure Call
2021-05-10 13:35:06
473
原创 Golang_反射
一、引入先看官方Doc中Rob Pike给出的关于反射的定义:Reflection in computing is the ability of a program to examine its own structure, particularly through types; it’s a form of metaprogramming. It’s also a great source of confusion.(在计算机领域,反射是一种让程序——主要是通过类型——理解其自身结构的一种能力。它是
2021-05-10 10:19:01
1432
原创 Golang__接口
接口1.1 什么是接口?面向对象世界中的接口的一般定义是“接口定义对象的行为”。它表示让指定对象应该做什么。实现这种行为的方法(实现细节)是针对对象的。在Go中,接口是一组方法签名。当类型为接口中的所有方法提供定义时,它被称为实现接口。它与OOP非常相似。接口指定了类型应该具有的方法,类型决定了如何实现这些方法。它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口接口定义了一组方法,如果某个对象实现了某个接口的所有方法,则此对象就实现了该接口。1.2 接口的定
2021-05-10 10:11:19
238
原创 Golang_结构体
一、结构体1.1 什么是结构体Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。1.2 结构体的定义和初始化type struct_variable_type struct { member definition; member definition; ... member definition;}一旦定义了结构体类型,它就能用于变量的声明variable_name :
2021-05-10 10:09:11
190
原创 Golang_指针
一、指针1.1 指针的概念指针是存储另一个变量的内存地址的变量。我们都知道,变量是一种使用方便的占位符,用于引用计算机内存地址。一个指针变量可以指向任何一个值的内存地址它指向那个值的内存地址。在上面的图中,变量b的值为156,存储在内存地址0x1040a124。变量a持有b的地址,现在a被认为指向b。1.2 获取变量的地址Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。package mainimport "fmt"func main() {
2021-05-09 17:08:20
122
原创 Golang_函数
1.1 什么是函数函数是执行特定任务的代码块。1.2 函数的声明go语言至少有一个main函数语法格式:func funcName(parametername type1, parametername type2) (output1 type1, output2 type2) {//这里是处理逻辑代码//返回多个值return value1, value2}func:函数由 func 开始声明funcName:函数名称,函数名和参数列表一起构成了函数签名。parameternam
2021-05-09 17:06:30
163
原创 Golang_字符串(string)
1.1 什么是stringGo中的字符串是一个字节的切片。可以通过将其内容封装在“”中来创建字符串。Go中的字符串是Unicode兼容的,并且是UTF-8编码的。示例代码:package mainimport ( "fmt")func main() { name := "Hello World" fmt.Println(name)}1.2 string的使用1.2.1 访问字符串中的单个字节package mainimport (
2021-05-09 17:05:37
201
原创 Golang_集合(Map)
1.1 什么是Mapmap是Go中的内置类型,它将一个值与一个键关联起来。可以使用相应的键检索值。Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的,也是引用类型使用map过程中需要注意的几点:map是无序的,每次打印出来的map都会不一样,它不能通过index获取,而必须通
2021-05-09 17:05:00
998
原创 Golang_切片(Slice)
1.1 什么是切片Go 语言切片是对数组的抽象。Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片(“动态数组”),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大切片是一种方便、灵活且强大的包装器。切片本身没有任何数据。它们只是对现有数组的引用。切片与数组相比,不需要设定长度,在[]中不用设定值,相对来说比较自由从概念上面来说slice像一个结构体,这个结构体包含了三个元素:指针,指向数组中slice指定的开始位
2021-05-09 17:04:17
226
原创 Golang_数组(Array)
一、数组(Array)@author:韩茹版权所有:北京千锋互联科技有限公司1.1 什么是数组Go 语言提供了数组类型的数据结构。数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形、字符串或者自定义类型。数组元素可以通过索引(位置)来读取(或者修改),索引从0开始,第一个元素索引为 0,第二个索引为 1,以此类推。数组的下标取值范围是从0开始,到长度减1。数组一旦定义后,大小不能更改。1.2 数组的语法声明和初始化数组需要指明数组的大小和存
2021-05-09 17:03:21
583
原创 Golang_基本语法——数据类型
一、基本数据类型以下是go中可用的基本数据类型1.1 布尔型bool布尔型的值只可以是常量 true 或者 false。一个简单的例子:var b bool = true1.2 数值型1、整数型int8有符号 8 位整型 (-128 到 127)长度:8bitint16有符号 16 位整型 (-32768 到 32767)int32有符号 32 位整型 (-2147483648 到 2147483647)int64有符号 64 位整型 (-92233720368
2021-05-09 17:02:01
208
原创 Golang_键盘输入和打印输出
一、打印输出1.1 fmt包fmt包实现了类似C语言printf和scanf的格式化I/O。格式化verb(‘verb’)源自C语言但更简单。详见官网fmt的API:https://golang.google.cn/pkg/fmt/1.2 导入包import "fmt"1.3 常用打印函数打印:func Print(a ...interface{}) (n int, err error)格式化打印:func Printf(format string, a ...interface{
2021-05-09 16:54:58
493
原创 Golang_基本语法——变量
一、变量的使用1.1 什么是变量变量是为存储特定类型的值而提供给内存位置的名称。在go中声明变量有多种语法。所以变量的本质就是一小块内存,用于存储数据,在程序运行过程中数值可以改变1.2 声明变量var名称类型是声明单个变量的语法。以字母或下划线开头,由一个或多个字母、数字、下划线组成声明一个变量第一种,指定变量类型,声明后若不赋值,使用默认值var name typename = value第二种,根据值自行判定变量类型(类型推断Type inference)如果一个变量有一
2021-05-09 16:47:11
400
原创 Go语言的核心特性
一、思想Less can be more大道至简,小而蕴真让事情变得复杂很容易,让事情变得简单才难深刻的工程文化二、核心特性Go语言之所以厉害,是因为它在服务端的开发中,总能抓住程序员的痛点,以最直接、简单、高效、稳定的方式来解决问题。这里我们并不会深入讨论GO语言的具体语法,只会将语言中关键的、对简化编程具有重要意义的方面介绍给大家,体验Go的核心特性。2.1 并发编程Go语言在并发编程方面比绝大多数语言要简洁不少,这一点是其最大亮点之一,也是其在未来进入高并发高性能场景的重要筹码。不
2021-05-09 16:45:15
364
原创 小白学习Python过程记录
Python变量类型Python 变量类型变量赋值多个变量赋值功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入Pyth...
2019-08-13 13:08:59
296
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人