Go语言中文网 为您找到相关结果 547

理解Go 1.13中sync.Pool的设计与实现

Go 1.13版本中有几个比较大的修改,其中之一是sync.Pool修改了部分实现,减小某些极端情况下的性能开销。文中内容来源于笔者读完sync.Pool源代码的思考和总结,内容以Go 1.13中的实现为准,少量内容涉及到Go 1.13之前,如有误区请读者多多指教。 概念 在本文内容开始之前需要理解几个在Go runtime中的概念,以便于更好的理解sync.Pool中一些实现。 goroutine抢占 Go中调度器是GMP模型,简单理解G就是goroutine;M可以类比内核线程,是执行G的地方;P是调度G以及为G的执行准备所需资源。一般情况下,P的数量CPU的可用核心数,也可由runtime.GOMAXPROCS指定。本文的重点并非goroutine调度器,在此不做详细解释,感兴趣可以翻...阅读全文

博文 2020-03-07 22:32:42 shaoyuan1943

defer 链表如何被遍历执行

去年开始写文章的第一篇就是关于 defer,名字比较文艺:《Golang 之轻松化解 defer 的温柔陷阱》,还被吐槽了。因为这篇文章,到《Go 夜读》讲了一期。不过当时纯粹是应用层面的,也还没有跳进 Go 源码这个大坑,文章看着比较清新,也没有大段的源码解析。 自从听了曹大在《Go 夜读》分享的 Go 汇编,以及研读了阿波张的 Go 调度器源码分析的文章后,各种源码、汇编满天飞…… 上次欧神写了一篇《Go GC 20 问》,全文也没有一行源码,整体读下来很畅快。今天这篇也来尝试一下这种写法,不过,我们先从一个小的主题开始:defer 链表是如何被遍历并执行的。 关于 defer 的源码分析文章,网络上也有很多。不过,很少有能完全说明白这个话题的,除了阿波张的。 我们知道,为了在退出函数前...阅读全文

博文 2020-05-02 18:57:22 qcrao

GoLang 学习笔记 - 运算符

运算符用于在程序运行时执行数学或逻辑运算。 Go 语言内置的运算符有: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 其他运算符 算术运算符 下表列出了所有Go语言的算术运算符。假定 A 值为 15,B 值为 5 。 运算符 描述 实例 + 相加 A + B 输出结果 20 - 相减 A - B 输出结果 10 * 相乘 A * B 输出结果 75 / 相除 B / A 输出结果 3 % 求余 B % A 输出结果 0 ++ 自增 A++ 输出结果 16 -- 自减 A-- 输出结果 14 GoLang 中 ++ 和 -- 操作只可以当成一个语句来使用,不可以作为表达式。这样可以避免很多问题。 a ++ //允许 b = a++ //不允许 即便如此,自增和自减仍然是一种很不规范...阅读全文

博文 2019-07-20 21:32:37 凉丶心园

小白也能够熟练掌握常用的数据库使用技巧

课程介绍 本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 课程目标 让小白也能够熟练掌握常用的数据库使用技巧,理解数据库的存储结构 适合人群 数据库入门学习者 前端学习者 课时列表 • 课时1: MySQL概要 • 课时2:MySQL在windows下的安装 • 课时3:MySQL在linux下的安装 • 课时4:MySQL在Mac下的安装 • 课时5:MySQL配置 • 课时6:添加和删除数据库(DB) • 课时7:数据类型 • 课时8:添加和删除数据表(table) • 课时9:给数据表添加或者删除列 • 课时10:修改某个数据列的名字或者数据类型 • 课时...阅读全文

算法图解阅读笔记-选择排序

数组与链表 数组是连续内存的应用方式,它的特点就是所有的单元的内存地址都是连续的,当需要扩展而初始化的内存不足够的时候,就需要重新申请内存。 链表是已上一个元素指向来完成存储的,它在内存的存储是分散的,无论是添加还是删除较数组的最大优势就是都不需要整体动,只需要上一个元素的指向调整就好,缺点就是无法直接通过计算获得某个元素,如果要在链表中查找某一个元素,就需要遍历整个链表(最差情况) 选择排序 遍历所有元素,挑出最小的元素放在结果集中并删除该元素,直到要排序的数据集中没有元素为止。 golang版本 package main import "fmt" func main() { info := []int{12, 3, 54, 6, 6777, 2342, 234, 55, 6, 6777,...阅读全文

博文 2018-10-22 16:35:02 zhaoxi_yu

第十天:golang学习笔记之container

★container | heap堆操作, list双向链表,ring环形链表 现在网上的算法题,很少有可以用golang作答的,不过看看别人造的轮子还是挺有意思的 container本身并不是包,但目录下包括三个子包:heap,list,ring heap 包含一个Interface接口,接口定义了Push(x interface{}),Pop() interface{} ,并包含了sort.Interface接口。 这里的堆是小顶堆 heap并没有可用的实现,但在test中找到一个: // An IntHeap is a min-heap of ints. type IntHeap []int func (h IntHeap) Len() int { return len(h) } fu...阅读全文

博文 2019-12-27 21:32:41 Macmillan_

GO语言学习笔记(四)GO语言控制语句

一、小程序要求:输出100以内能被2整除的数代码如下: package main import "fmt" func main() { var max int = 100 number := 2 for i := 1; i <= max; i++ { if i%number == 0 { fmt.Println(i) } } } 运行以及输出如下:执行:go run test1.go输出结果:2468101214161820......9092949698100 包含的知识点:1)变量Go语言包含的值类型:字符串、整型、浮点型、布尔型等 变量的声明和赋值的四种写法: ⑴var 变量 = "字符串"解释:使用var关键字声明一个变量并赋值 ⑵var 变量a, 变量b int = 数字1, 数字...阅读全文

博文 2019-01-28 17:35:13 Mr大表哥

Golang筑基 ——运算符

golang的运算符同C/C++一样,共有如下几种 算术运算符 下表列出了所有Go语言的算术运算符。假定 A 值为 10,B 值为 20。 图片.png 注意: 自增(++)和自减(--)不同于C/C++,a++和++a在golang中是没有区别的,同理,a--和--a也是如此。我觉得这也是golang方便之处,去除一些没必要功能设计,让语言本身更便捷。 关系运算符 下表列出了所有Go语言的关系运算符。假定 A 值为 10,B 值为 20。 图片.png 逻辑运算符 下表列出了所有Go语言的逻辑运算符。假定 A 值为 True,B 值为 False。 图片.png 位运算符 位运算符对整数在内存中的二进制位进行操作。 下表列出了位运算符 &, |, 和 ^ 的计算: 图片.png 赋值运算符...阅读全文

博文 2020-04-13 21:32:49 技术修仙

Golang 数据结构到底是怎么回事?gdb调一调?

“ 不仅限于语法,使用gdb,dlv工具更深层的剖析golang的数据结构” Golang数据结构 变量:有意义的一个数据块。 变量名:一个有意义的数据块的名字。 为什么特意会有这个章节? golang本质是全局按照值传递的,也就是copy值,那么你必须知道你的内存对象是包含哪些内容,才能清楚掌握你在copy值的时候复制了哪些东西,这个很重要,第一部分的正文内容从这里开始。具体如下类型: num bool string array slice map channel interface 这些结构实际在地址空间栈是什么形式的实现?这里直接看地址空间的内容,以下都是以这个例子进行分析: package main func main () { var n int64 = 11 var b bool...阅读全文

博文 2020-04-12 19:32:44 奇伢云存储

Golang map

前些天看了DAVE CHENEY大神的直播。里面讲到了go的map实现。做个笔记 (我用的是go1.13 貌似大神直播时候用的是还没发布的1.15 所以本文中的代码都是1.13中的。与1.15略有差异) compile time rewriting: 左边对map的操作实际上被编译成了右边的调用 v := m["key"] -> runtime.mapaccess1(m, "key", &v) v, ok := m["key"] -> runtime.mapaccess2(m, "key", &v, &ok) m["key"] = 9001 -> runtime.mapinsert(m, "key", 9001) delete(m, "key") -> runtime.mapdelete(m...阅读全文

博文 2020-05-12 11:35:48 郭老汉

Go 1.13中 sync.Pool 是如何优化的?

Go 1.13持续对 sync.Pool进行了改进,这里我们有两个简单的灵魂拷问: 1、做了哪些改进?2、如何做的改进? 首先回答第一个问题: 对STW暂停时间做了优化, 避免大的sync.Pool严重影响STW时间 第二个优化是GC时入股对sync.Pool进行回收,不会一次将池化对象全部回收,这就避免了sync.Pool释放对象和重建对象导致的性能尖刺,造福于sync.Pool重度用户。 第三个就是对性能的优化。 对以上的改进主要是两次提交:: sync: use lock-free structure for Pool stealing和sync: use lock-free structure for Pool stealing。 两次提交都不同程度的对性能有所提升,依据不同的场景,...阅读全文

博文 2019-11-10 00:02:22 smallnest

删除排序链表中的重复元素

题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 思路 1.这道题的核心思想是跳过值重复的结点。 2.可以设置一个哑结点,防止链表中全部的值都是重复的。 3.可以设置两个值,分别用于标记当前结点是否重复。 4.整体流程就是: 进入循环 保存当前结点 循环跳过重复结点 判断当前结点是否移动过,若移动过,需要跳过 Java代码实现 class Solution { public int findMin(int[] array) { if(array.length == 0) return 0; int left = 0; int right = array.len...阅读全文

博文 2020-03-17 05:32:49 youzhihua

golang中defer的执行过程是怎样的?

在同一个goroutine中: 多个defer的调用栈原理是什么?defer函数是如何调用的? 为了探究其中的奥秘我准备了如下代码: package main import "fmt" func main() { xx() } func xx() { defer aaa(100, "hello aaa") defer bbb("hello bbb") return } func aaa(x int, arg string) { fmt.Println(x, arg) } func bbb(arg string) { fmt.Println(arg) } 输出:bbb100 hello aaa从输出结果看很像栈的数据结构特性:后进先出(LIFO)。 首先从汇编入手去查看xx()函数的执行过程,...阅读全文

博文 2019-07-19 03:02:37 XITEHIP

c++对象模型

使用c++有些年头了,有一本深度搜索c++对象模型的书写的很赞,很经典。本文是本书的读书笔记。 #### 关于对象 ##### 加上封装后的布局成本 c语言中如下声明一个结构体 ``` typedef struct point3d{ float x; float y; float z;}Point3d; ``` struct point3d 转化为class Point3d之后 ``` class Point3d { public: Point3d(float x = 0.0f, float y = 0.0f; float z = 0.0f) :_x(x),_y(y),_z(z){} private: float _x,_y,_y; } ``` 封装带来的布局成本增加了多少?实际是没有增加布...阅读全文

博文 2019-11-06 09:53:55 bytemode

面试必备!就凭借着这份Java 高频面试题,我拿下了阿里,字节的offer!

List 1. 为什么 arraylist 不安全? 我们查看源码发现 arraylist 的 CRUD 操作,并没有涉及到锁之类的东西。底层是数组,初始大小为 10。插入时会判断数组容量是否足够,不够的话会进行扩容。所谓扩容就是新建一个新的数组,然后将老的数据里面的元素复制到新的数组里面(所以增加较慢)。 2. CopyOnWriteArrayList 有什么特点? 它是 List 接口的一个实现类,在 java.util.concurrent(简称 JUC,后面我全部改成 juc,大家注意下)。 内部持有一个 ReentrantLock lock = new ReentrantLock(); 对于增删改操作都是先加锁再释放锁,线程安全。并且锁只有一把,而读操作不需要获得锁,支持并发。 读...阅读全文

博文 2020-06-02 17:32:50 前程有光

栈的性质 只允许一段插入和删除数据 先进后出 栈可以用链表实现也可以用数组实现 操作时间复杂度 入栈和出栈时间复杂度都为O(1) (因为只涉及操作栈顶部的第一个元素) 涉及到可扩容的栈的时候,因为栈满了要扩容,数据迁移时间复杂度为O(n) 但是前n次插入的时间复杂度都是O(1) 进行均摊后, 时间复杂度为O(2) = O(1) 所以不管是否扩容 时间复杂度都是O(1) 曾经(去年) 面试的时候有个面试官曾过我, 你知道栈吗? 两个栈怎么组成一个先进先出的队列, 可是我太年轻那,bb半天也没有让人家满意。 栈的golang代码实现 type ArrayStack struct { data []interface{} top int } func NewArrayStack() *ArrayS...阅读全文

博文 2019-06-26 13:32:40 五知小白羊

redis 基础数据结构

1 前言 Redis的5种数据类型(String,Hash,List,Set,Sorted Set),每种数据类型都提供了最少两种内部的编码格式,而且每个数据类型内部编码方式的选择对用户是完全透明的,Redis会根据数据量自适应地选择较优化的内部编码格式。 查看某个键的内部编码格式,使用命令object encoding keyname Reids的每个键值内部都是使用叫redisObject这个C语言结构体保存的,代码如下: type:表示键值的数据类型,也就是那5种基本数据类型。 encoding:表示键值的内部编码方式, #define OBJ_ENCODING_RAW 0 /* Raw representation */ #define OBJ_ENCODING_INT 1 /* E...阅读全文

博文 2019-12-17 18:32:48 LZhan

图解Go语言内存分配

载自图解Go语言内存分配 Go语言内置运行时(就是runtime),抛弃了传统的内存分配方式,改为自主管理。这样可以自主地实现更好的内存使用模式,比如内存池、预分配等等。这样,不会每次内存分配都需要进行系统调用。 Golang运行时的内存分配算法主要源自 Google 为 C 语言开发的TCMalloc算法,全称Thread-Caching Malloc。核心思想就是把内存分为多级管理,从而降低锁的粒度。它将可用的堆内存采用二级分配的方式进行管理:每个线程都会自行维护一个独立的内存池,进行内存分配时优先从该内存池中分配,当内存池不足时才会向全局内存池申请,以避免不同线程对全局内存池的频繁竞争。 基础概念 Go在程序启动的时候,会先向操作系统申请一块内存(注意这时还只是一段虚拟的地址空间,并不...阅读全文

博文 2020-03-02 01:32:44 网管同学

12 - go简单实现hashmap

注意:还没有解决hash冲突和hash倾斜的问题。 package main import "fmt" var nowCapacity = 10 //当前容量 const maxCapacity = 100 //最大容量 const loadFactor = 0.75 //负载因子(决定扩容因数) type Entry struct { k string //key v interface{} //值 next *Entry } type HashMap struct { size int //map的大小 bucket []Entry //存放数据的桶,为slice } //创建一个CreateHashMap的函数,返回一个HashMap指针 func CreateHashMap() *H...阅读全文

博文 2020-05-12 19:32:47 欢乐毅城

golang container/ring源码解读

最近在看gokit的熔断器源码的时候看到了内部有使用到 container/ring 的这个数据结构;虽然大体知道这个数据结构提供的一个常用API,也知道该怎么用;但是不知道内部具体是怎么实现的。所以就看了内部的源码实现;在这里分享出来,有不对的地方欢迎大家指正。 在正式开始讲解源码之前先铺垫几个基础的数据结构知识 1、单链表 节点内部会存储当前节点的值跟下一个节点的指针,单链表的访问只能向前推进访问不能后退 单链表 2、单向循环链表 单向循环链表的尾节点的后继节点指向了链表的头结点;其他跟单链表完全相同 单向循环链表 3、双向链表 双向链表每个节点内部存储了当前节点的值,后继节点的指针,前驱节点的指针 双向链表 4、双向循环链表 双向循环链表的头结点的前驱节点为链表的尾节点指针,而尾结点的...阅读全文

博文 2020-05-28 21:32:46 airun

通用抽奖工具之系统设计

前言 上篇文章《通用抽奖工具之需求分析》我们已经通过一些常见的抽奖场景,得到了符合这些抽奖场景的抽奖工具五要素: 抽奖五要素 要素名称 第一要素 活动 第二要素 场次 第三要素 奖品 第四要素 中奖概率 第五要素 均匀投奖 以及创建一个抽奖活动的5个基本步骤,如下: 活动配置 场次配置 奖品配置 奖品中奖概率配置 奖品投奖配置 上篇文章回顾 《通用抽奖工具之需求分析》 需求已经分析完了,今天我们就来看看这通用抽奖工具具体的设计,分为如下三个部分: DB设计 配置后台设计 接口设计 DB设计 第一要素活动配置的抽奖活动表: -- 通用抽奖工具(万能胶Glue) glue_activity 抽奖活动表 CREATE TABLE `glue_activity` ( `id` int(11) uns...阅读全文

博文 2020-01-02 10:34:20 TIGERB

面试:从尾到头打印链表

题目:从尾到头打印链表 要求:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 示例: ` 输入:head = [1,3,2] 输出:[2,3,1] ` 限制: 0 <= 链表长度="" <="10000 题解1:递归法 因为是从尾到头返回每一个节点的值,所以很容易想到如果从最后的节点将值放入数组中,然后再往前逐步将数据放入数组,最后回到头节点返回即可,可以想到递归就能轻松做到,只要注意递归函数的结束条件即可。 /** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ func reversePrint(head *ListNode...阅读全文

博文 2020-02-28 16:34:31 若鱼治水

让我们一起啃算法----合并两个有序链表

合并两个有序链表(Merge-Two-Sorted-Lists) 题干如下: 将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4来源:力扣 这个题目和 两数相加 相似,都是考察对链表的操作。其实具体实现方式也差不多啦。 解题思路 根据题干我们知道,给定的两个链表是有序的。假设 l1 指向其中一个链表的头部,l2 指向另一个链表的头部,并初始化 head 和 current,使它们指向一个默认的节点。我们比较 l1 指向节点的值 V(l1) 与 l2 指向节点的值 V(l2) 的大小,如果 V(l1) 的值小于 V(l2) 的值,则使 current.next 指向...阅读全文

博文 2020-05-05 16:32:40 三斤和他的朋友们

C++ 虚函数表剖析

一、概述 为了实现C++的多态,C++使用了一种动态绑定的技术。这个技术的核心是虚函数表(下文简称虚表)。本文介绍虚函数表是如何实现动态绑定的。 二、类的虚表 每个包含了虚函数的类都包含一个虚表。 我们知道,当一个类(A)继承另一个类(B)时,类A会继承类B的函数的调用权。所以如果一个基类包含了虚函数,那么其继承类也可调用这些虚函数,换句话说,一个类继承了包含虚函数的基类,那么这个类也拥有自己的虚表。 我们来看以下的代码。类A包含虚函数vfunc1,vfunc2,由于类A包含虚函数,故类A拥有一个虚表。 class A { public: virtual void vfunc1(); virtual void vfunc2(); void func1(); void func2(); pri...阅读全文

博文 2019-08-23 17:21:31 qq470603823

使用Golang爬取捧腹网段子

package main import ( "fmt" "io" "net/http" "os" "regexp" "strconv" "strings" ) func HttpGet(url string) (result string, err error) { client := &http.Client{} req, err1 := http.NewRequest("GET", url, nil) if err1 != nil { err = err1 return } req.Header.Add("User-Agent", "test2") resp, err2 := client.Do(req) if err2 != nil { err = err2 return } defe...阅读全文

博文 2020-02-01 19:32:45 FredricZhu

图解Go语言内存分配

Go语言内置运行时(就是runtime),抛弃了传统的内存分配方式,改为自主管理。这样可以自主地实现更好的内存使用模式,比如内存池、预分配等等。这样,不会每次内存分配都需要进行系统调用。Golang运行时的内存分配算法主要源自 Google 为 C 语言开发的 TCMalloc算法,全称 Thread-CachingMalloc。核心思想就是把内存分为多级管理,从而降低锁的粒度。它将可用的堆内存采用二级分配的方式进行管理:每个线程都会自行维护一个独立的内存池,进行内存分配时优先从该内存池中分配,当内存池不足时才会向全局内存池申请,以避免不同线程对全局内存池的频繁竞争。为了更好的阅读体验,手动贴上文章目录: 基础概念Go在程序启动的时候,会先向操作系统申请一块内存(注意这时还只是一段虚拟的地址...阅读全文

博文 2019-03-14 01:34:40 ddu_sw

两个链表的第一个公共结点

题目描述 输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的) 思路 假设两个链表的第一个公共结点为c。 链表1可以表示为a+c,链表2可以表示为b+c。 可以通过a+c+b+c = b+c+a+c来快速求出c的值,若没有公共结点,那c便是null。 可以根据下图,简单理解下这个过程。 Java代码实现 public class Solution { public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { ListNode p1 = pHead1; ListNode p2 = pHead2; while(p1 != p2){ p...阅读全文

博文 2020-02-27 12:32:41 youzhihua

golang 源码剖析(7): 延迟defer

简介 延迟调用(defer)的优势是: 即使函数执行出错,依然能保证回收资源等操作得以执行 可以在变量的定义处加入defer,代码结构上避免忘记做某些数据的回收 劣势: 性能上会会比直接调用慢一些 如果在defer中释放,相对来说只会在函数执行结束的时候才会调用,变量生命周期会变长. 定义 编写以下程序, dump出汇编. defer主要调用了一下两个函数func deferprocStack(d *_defer)和func deferreturn(arg0 uintptr) package main import ( "fmt" ) func main() { defer fmt.Println(0x11) } (base) ➜ readsrc go tool objdump -s "ma...阅读全文

博文 2020-03-08 17:32:42 darcyaf

数据类型底层实现(三) channel

底层数据结构 type hchan struct { qcount uint // total data in the queue dataqsiz uint // size of the circular queue buf unsafe.Pointer // points to an array of dataqsiz elements elemsize uint16 closed uint32 elemtype *_type // element type sendx uint // send index recvx uint // receive index recvq waitq // list of recv waiters sendq waitq // list of send...阅读全文

博文 2020-02-24 21:32:59 元气蛋蛋

爬虫管理平台 Crawlab v0.4.6 发布

前言 本次更新主要集中在日志管理、任务触发、爬虫展示等优化,以及加入 Node.js SDK。 更新日志 功能 / 优化 Node.js SDK. 用户可以将 SDK 应用到他们的 Node.js 爬虫中. 日志管理优化. 日志搜索,错误高亮,自动滚动. 任务执行流程优化. 允许用户在触发任务后跳转到该任务详情页. 任务展示优化. 在爬虫详情页的最近任务表格中加入了“参数”列. #295 爬虫列表优化. 在爬虫列表页加入"更新时间"和"创建时间". #505 页面加载占位器. Bug 修复 定时任务配置失去焦点. #519 无法用 CLI 工具上传爬虫. #524 产品规划 结果展示 支持其他数据库 爬虫 支持 Git 仓库同步 更好的 Scrapy 支持 更好的长任务支持 可配置爬虫 可配...阅读全文

博文 2020-02-15 10:32:40 MarvinZhang

defer 链如何被遍历

去年开始写文章的第一篇就是关于 defer,名字比较文艺:《Golang 之轻松化解 defer 的温柔陷阱》,还被吐槽了。因为这篇文章,到《Go 夜读》讲了一期。不过当时纯粹是应用层面的,也还没有跳进 Go 源码这个大坑,文章看着比较清新,也没有大段的源码解析。 自从听了曹大在《Go 夜读》分享的 Go 汇编,以及研读了阿波张的 Go 调度器源码分析的文章后,各种源码、汇编满天飞…… 上次欧神写了一篇《Go GC 20 问》,全文也没有一行源码,整体读下来很畅快。今天这篇也来尝试一下这种写法,不过,我们先从一个小的主题开始:defer 链表是如何被遍历并执行的。 关于 defer 的源码分析文章,网络上也有很多。不过,很少有能完全说明白这个话题的,除了阿波张的。 我们知道,为了在退出函数前...阅读全文

博文 2020-03-23 21:46:11 qcrao-2018

Golang数据结构-线性表

基本概念 定义:零个或者多个数据元素的有限序列,在复杂的线性表中,一个数据元素可以由若干个数据项组成。 直接前驱元素:若线性表记为(a1a2a3...an),则表中a2领先于a3,则称a2是a3的直接前驱元素,且有且仅有一个直接前驱元素 直接后继元素:称a3是a2的直接后继元素,且有且仅有一个直接后继元素 线性表的长度:线性表的元素个数n,为线性表的长度,随着线性表插入和删除操作,该值是变动的,线性表的存储长度一般小于数组的长度 数组的长度:存放线性表的存储空间的长度,存储分配后这个值一般是不变的 空表:长度n为0时,该线性表为空表 地址:存储器的每个存储单元都有自己在内存的编号,简称为地址 线性表的存储 顺序存储结构 线性表的顺序存储结构是指用一段地址连续的存储单元依次存储线性表的数据元素...阅读全文

博文 2020-05-30 03:32:48 也疯狂

线性表之数组

数组是一种线性数据结构。 特点: - 一组连续的内存空间,来存储一组具有相同类型的数据。 时间复杂度: - 查找: O(1) - 插入: O(n) - 删除: O(n) 代码实现: 定义基本的数组结构: type Array struct { data []int length uint } func NewArray(capacity uint) *Array { if capacity == 0 { return nil } return &Array{ data: make([]int, capacity, capacity), length: 0, } } 数组的长度: func (this *Array) Len() uint { return this.length } 是否越界...阅读全文

博文 2019-06-25 16:03:43 五知小白羊

leetcode_61

Golang: 思路:先得出链表长度,然后就可以对k做处理,打个比方,链表长度5,那么k=6与k=1的情况就是一致的,但是我最后代码写的还是很复杂,不做参考吧。 代码如下: func rotateRight(head *ListNode, k int) *ListNode { if k==0||head==nil||head.Next==nil { return head } length,temp:=0,head for temp.Next!=nil{ temp=temp.Next length++ } length++ var res *ListNode last,i:=temp,0 temp=head k=k%length if k==0 { return head }else { l...阅读全文

博文 2020-02-04 19:33:06 淳属虚构

好程序员大数据培训之掌握Hive的静态分区与动态分区

分区是hive存放数据的一种方式。将列值作为目录来存放数据,就是一个分区。这样查询时使用分区列进行过滤,只需根据列值直接扫描对应目录下的数据,不扫描其他不关心的分区,快速定位,提高查询效率。分动态和静态分区两种: 1.静态分区:若分区的值是确定的,那么称为静态分区。新增分区或者是加载分区数据时,已经指定分区名。 createtableifnotexistsday_part1( uidint, unamestring ) partitionedby(yearint,monthint) rowformatdelimitedfieldsterminatedby'' ; ##加载数据指定分区 loaddatalocalinpath'/root/Desktop/student.txt'intotabl...阅读全文

golang 源码剖析(2) TCMalloc内存管理器

使用TCMalloc(Thread-Caching Malloc)当内存管理器 以下翻译自tcmalloc.html 动机 相对于glibc2.3 malloc, 在2.8GHz P4上,ptmalloc2需要大概300ns执行一个malloc/free 操作,TCMalloc只需要50ns 多线程时,可减少锁竞争. 小对象基本都是无锁,对于大对象,ptmalloc2也使用每个线程一个arena,但是在不同的arena上分配大对象时内存不会复用而会重新去申请内存 TCMalloc在小对象上也是空间高效的,对N个8字节对象只需要N81.01bytes,而ptmalloc2每个对象使用4字节头,也就是12字节,对齐到8字节的倍数,从而使用了16N个字节 预览 TCMalloc为每个线程分配一个线...阅读全文

博文 2020-03-04 10:32:47 darcyaf

调度相关的重要数据结构

声明 下面的分析均基于Golang1.14版本。 以下数据结构均做了裁剪,只留了部分调度密切相关的重要结构。 一、G的定义 裁剪了大部分字段,后面填坑把其它字段的作用及用途整理。 type g struct { stack stack // offset known to runtime/cgo G的栈信息含栈的起始和终止地址 m *m // current m; offset known to arm liblink 运行时绑定的M sched gobuf // 运行时的上下文 goid int64 // g id 唯一的标识id } type stack struct { lo uintptr hi uintptr } type gobuf struct { sp uintptr // ...阅读全文

博文 2020-05-11 07:32:41 不争_900c

leetcode_86

Golang: 思路:搬运我的题解 这题在第一次做的时候嫌麻烦,直接用数组解决了,时间百分百,空间百分之五,还是有些不满意的,就用双指针重新写了下,然后来到了双百效率 思路在代码里有提及,就不再详述了,简单说一下这里替换的含义 1->4->3->2->5->2, x = 3 发生替换的时候 p1 p2 p3 1->4->3->2->5->2 这里怎么替换,就是: 先从原链表里提取出p3, 然后将p3插到p1及p1后面的元素之间, 更新p1,更新p3 代码如下: func partition(head *ListNode, x int) *ListNode { if head==nil||head.Next==nil { return head } //什么时候需要替换呢? //当我找到某个元...阅读全文

博文 2020-03-01 15:32:45 淳属虚构

Leetcode 876. Middle of the Linked List

Given a non-empty, singly linked list with head node head, return a middle node of linked list. If there are two middle nodes, return the second middle node. Example 1: Input: [1,2,3,4,5] Output: Node 3 from this list (Serialization: [3,4,5]) The returned node has value 3. (The judge's serialization of this node is [3,4,5]). Note that we returned a...阅读全文

博文 2019-07-24 19:32:38 大龄码农的技术点滴

探究 Go 语言 defer 语句的三种机制

Golang 的 1.13 版本 与 1.14 版本对 defer 进行了两次优化,使得 defer 的性能开销在大部分场景下都得到大幅降低,其中到底经历了什么原理? 这是因为这两个版本对 defer 各加入了一项新的机制,使得 defer 语句在编译时,编译器会根据不同版本与情况,对每个 defer 选择不同的机制,以更轻量的方式运行调用。 堆上分配 在 Golang 1.13 之前的版本中,所有 defer 都是在堆上分配,该机制在编译时会进行两个步骤: 在 defer 语句的位置插入 runtime.deferproc,当被执行时,延迟调用会被保存为一个 _defer 记录,并将被延迟调用的入口地址及其参数复制保存,存入 Goroutine 的调用链表中。 在函数返回之前的位置插入 r...阅读全文

博文 2020-03-01 15:32:41 张凯强_zkqiang

探究 Go 语言 defer 语句的三种机制

Golang 的 1.13 版本 与 1.14 版本对 defer 进行了两次优化,使得 defer 的性能开销在大部分场景下都得到大幅降低,其中到底经历了什么原理? 这是因为这两个版本对 defer 各加入了一项新的机制,使得 defer 语句在编译时,编译器会根据不同版本与情况,对每个 defer 选择不同的机制,以更轻量的方式运行调用。 堆上分配 在 Golang 1.13 之前的版本中,所有 defer 都是在堆上分配,该机制在编译时会进行两个步骤: 在 defer 语句的位置插入 runtime.deferproc,当被执行时,延迟调用会被保存为一个 _defer 记录,并将被延迟调用的入口地址及其参数复制保存,存入 Goroutine 的调用链表中。 在函数返回之前的位置插入 r...阅读全文

博文 2020-03-01 14:34:39 张凯强zkqiang

leetcode_445

Golang: 思路:组合题,先反转链表,再让它们相加,再反转回来即可。针对题目提到的进阶,可以先将两个链表拷贝下来做大数加法,再赋值回去或者新开一条链表 代码如下: func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode { l1 = reverseList(l1) l2 = reverseList(l2) temp:=addTwoLinkedLists(l1,l2) return reverseList(temp) } //两个链表相加,使用的某大佬的代码 func addTwoLinkedLists(l1 *ListNode, l2 *ListNode) *ListNode { var temp = &ListNode{} va...阅读全文

博文 2020-04-14 13:32:46 淳属虚构

leetcode_147

Golang: 思路:既然是链表的插入排序,那就按照题意来,做插入排序 代码如下: func insertionSortList(head *ListNode) *ListNode { if head==nil||head.Next==nil { return head } temp1:=head res:=head temp2:=head.Next temp1.Next=nil for temp2!=nil{ //预留下一个点 tNext:=temp2.Next temp2.Next=nil var p1 *ListNode p2:=res for p2!=nil&&temp2.Val>p2.Val{ p1=p2 p2=p2.Next } temp2.Next=p2 if p1==nil ...阅读全文

博文 2020-03-01 15:32:43 淳属虚构

leetcode_328

Golang: 思路:这题O(1)空间复杂度,其实只需要拆分成两个链表,然后连接下就好了 代码如下: func oddEvenList(head *ListNode) *ListNode { nd1,nd2:=&ListNode{Val:0},&ListNode{Val:0} node1,node2,temp,flag:=nd1,nd2,head,0 for temp!=nil{ if flag%2==0{ node1.Next=temp node1=node1.Next }else{ node2.Next=temp node2=node2.Next } temp=temp.Next flag++ } node2.Next=nil node1.Next=nd2.Next return nd1...阅读全文

博文 2020-04-05 20:33:06 淳属虚构

探究 Go 语言 defer 语句的三种机制

Golang 的 1.13 版本 与 1.14 版本对 defer 进行了两次优化,使得 defer 的性能开销在大部分场景下都得到大幅降低,其中到底经历了什么原理? 这是因为这两个版本对 defer 各加入了一项新的机制,使得 defer 语句在编译时,编译器会根据不同版本与情况,对每个 defer 选择不同的机制,以更轻量的方式运行调用。 堆上分配 在 Golang 1.13 之前的版本中,所有 defer 都是在堆上分配,该机制在编译时会进行两个步骤: 在 defer 语句的位置插入 runtime.deferproc,当被执行时,延迟调用会被保存为一个 _defer 记录,并将被延迟调用的入口地址及其参数复制保存,存入 Goroutine 的调用链表中。 在函数返回之前的位置插入 r...阅读全文

博文 2020-03-01 14:32:38 张凯强

leetcode_143

Golang: 思路:链表,这题最简单的思路是,链表存进数组,然后一次性解决。再复杂一点就是,链表从中间分开,后半部分反转,然后再和前半部分依照特定规律合并。这里给简单思路,个人觉得这题没必要追求空间复杂度。 代码如下: func reorderList(head *ListNode) { node:=head if node==nil||node.Next==nil||node.Next.Next==nil{ return } var arr []*ListNode arr=append(arr, head) length:=1 for node.Next!=nil{ length++ node=node.Next arr=append(arr, node) } for i:=0;i阅读全文

博文 2020-03-11 13:33:07 淳属虚构

leetcode_725

Golang: 思路:这题是分配糖果的进阶篇,分配链表,这题为了实现简单,没那么在乎空间复杂度,因此最终结果空间复杂度效率较低,也算是在预期之内。 代码如下: func splitListToParts(root *ListNode, k int) []*ListNode { node1:=root var nodes []*ListNode for node1!=nil{ nodes=append(nodes,node1) node1=node1.Next } if len(nodes)阅读全文

博文 2020-04-07 15:32:48 淳属虚构