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

协程实现原理-源码分析

G 1 .goroutine的新建,休眠,恢复,停止都会受到go运行时的管理 2 .goroutine执行异步操作时,等操作完成之后在恢复,不会占用系统线程 3 .goroutine新建或者恢复会添加到运行队列,等待M取出并运行 4 .G的状态 1 .空闲中:idle:G刚创建,没有初始化 2 .待运行:runnable:g正在运行队列中,等待M取出并运行 3 .运行中:running:M正在运行这个G,这时M会拥有一个P 4 .系统调用:syscall:表示这个M这个在运行这个g发起的系统调用,这时M并不拥有p 5 .等待中waiting:表示g在等待某些条件完成。此时g不在运行也不再运行队列中,可能在channel等待队列中 6 .已终止:dead,表示G未被使用,可能已经执行完毕 7 ...阅读全文

博文 2019-10-09 22:32:45 aside section ._1OhGeD

数据结构和算法(Golang实现)(15)常见数据结构-列表

列表 一、列表 List 我们又经常听到列表 List数据结构,其实这只是更宏观的统称,表示存放数据的队列。 列表List:存放数据,数据按顺序排列,可以依次入队和出队,有序号关系,可以取出某序号的数据。先进先出的队列 (queue)和先进后出的栈(stack)都是列表。大家也经常听说一种叫线性表的数据结构,表示具有相同特性的数据元素的有限序列,实际上就是列表的同义词。 我们一般写算法进行数据计算,数据处理,都需要有个地方来存数据,我们可以使用封装好的数据结构List: 列表的实现有顺序表示或链式表示。 顺序表示:指的是用一组地址连续的存储单元依次存储线性表的数据元素,称为线性表的顺序存储结构。它以物理位置相邻来表示线性表中数据元素间的逻辑关系,可随机存取表中任一元素。顺序表示的又叫顺序表,...阅读全文

博文 2020-04-07 16:32:34 陈星星

用golang实现的单向链表

复习一下数据结构,用golang来实现单向链表 package main import "fmt" type Object interface{} type Node struct { Data Object next *Node } type List struct { size uint64 head *Node tail *Node } func (list *List) Init() { (*list).size = 0 (*list).head = nil (*list).tail = nil } // 向链表追加节点 func (list *List) Append(node *Node) bool { if node == nil { return false } (*node...阅读全文

博文 2019-07-12 00:33:43 ustb80

微服务注册中心注册表与hashcode实现golang版

背景 基于负载均衡的服务调用 基于负载均衡的服务相互调用指的是通过基于Lvs、Haproxy、Nginx等负载均衡软件来构建一个负载均衡服务,所有的服务调用都通过负载均衡器 从负载均衡的这种模式下其实有两个主要的问题: 一是中心化,整个系统都基于负载均衡器,负载均衡就相当于整个业务的中心,虽然我们可以通过一些高可用手段来保证,但其实内部流量通常是巨大的,很容易出现性能瓶颈二是增加了一次TCP交互 当然也有很多好处,比如可以做一些负载均衡、长链接维护、分布式跟踪等,这不是本文重点 基于注册中心的服务调用 所有的服务都启动后都通过注册中心来注册自己,同时把注册中心里面的服务信息拉回本地,后续调用,就直接检查本地的服务和节点信息来进行服务节点的调用 注册中心中的注册表 每个服务节点都会来注册中心进...阅读全文

leetcode-hot-(2/100)

2/100-两数相加 题目描述 go to leetcode 分析解答 从题目描述中,联想到CPU的加法器:每个链表代表一个数字,每个节点则表示一位数字。因此,我们可以模拟CPU,也设立一个进位标志位carry。对于合并后的新节点,节点的值value = 对应位置两个节点的value和 + carry func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode { // 1.for each reverse-list l1, l2: // new node's val = l1.val + l2.val + carry(初值为0) // carry = new carry // 2.handle left reverse-list var...阅读全文

博文 2020-04-29 17:33:16 zhangshaos

Golang实现数据结构“栈”的三种实现,性能对比及应用示例

前言本文主要讲一讲栈这种非常基础的数据结构,以及其如何用Golang来实现的3种方式,简单用golang bench做一个性能比对,以字符串括号匹配的一个例子来看其一个简单的应用场景。 栈的特性栈是一种FILO类型的数据结构,FILO 即 Fisrt In Last Out,也就是先进后出,也可以说是后进先出。它很像一个只有一个出口的站立的杯子,后边进入杯子的东西,会被最先取出来。 栈实现的三种方式首先,实现栈,远非只有这三种方式,这里,只是举例3种相对比较典型的方式。每一种实现方式都很简单,也没什么需要太费周章讲的必要。 1、利用Golang的slice 12345678910111213141516171819202122232425262728293031323334353637383...阅读全文

博文 2019-04-18 14:22:06 国南之境

总结

在昨天的面试中,自己需要总结很多问题,以前一直怕面试,因为面试会问答很多以前都没怎么注意到的问题,常常面试了几次,拿到了一个差不多的工作,就停止面试了,这是一个死循环。现在清楚了一定时刻保持面试的状态,原因如下:1. 很多面试知识只在面试的时候被问到,在实际工作中只会用到一小部分。2. 要明白市场现在有什么类型的需求,需求量大不大 面试其实是一个策略,很多时候就是隐藏自己的劣势,发挥自己的优势。如何发挥自己优势呢?其实就是要结合面试官的问题,举一反三,把自己掌握的内容引出来,而不是仅仅回答面试官的问题,面试官并不是想用单一的问题难倒你,只是想了解实际知识的掌握情况,对问题深不深入,有没有实际经验。 接下来,需要各个方面都加强,对之前一些模拟两可的知识进行梳理,要达到熟练的程度,面对面试的问题...阅读全文

博文 2019-06-21 16:02:43 radial_light

关于:http包疑问

```go func main() { http.HandleFunc("/hello", hello) http.ListenAndServe("", nil) } ``` ``` 这两条语句是怎么产生联系的.mux路由表通过什么方法访问?是在main()主线程空间生成了什么对象吗? 执行完http.HandleFunc("/hello", hello)函数没人返回任何对象. 是不是通过hello(handlerfunc)传进去的 *http.request产生联系的?如果是.在main空间怎么访问到*http.request. ``...阅读全文

(三)golang开箱即用container heap、list、ring

package main import ( "container/heap" "fmt" ) type IntHeap []int //我们自定义一个堆需要实现5个接口 //Len(),Less(),Swap()这是继承自sort.Interface //Push()和Pop()是堆自已的接口 //返回长度 func (h *IntHeap) Len() int { return len(*h); } //比较大小(实现最小堆) func (h *IntHeap) Less(i, j int) bool { return (*h)[i] < (*h)[j]; } //交换值 func (h *IntHeap) Swap(i, j int) { (*h)[i], (*h)[j] = (*h)[...阅读全文

博文 2018-11-10 22:34:45 杰克曼

深入理解go的slice和到底什么时候该用slice

前言 用过go语言的亲们都知道,slice(中文翻译为切片)在编程中经常用到,它代表变长的序列,序列中每个元素都有相同的类型,类似一个动态数组,利用append可以实现动态增长,利用slice的特性可以很容易的切割slice,它们是怎么实现这些特性的呢?现在我们来探究一下这些特性的本质是什么。 先了解一下slice的特性 定义一个slice: s := []int{1,2,3,4,5} fmt.Println(s) // [1 2 3 4 5] 一个slice类型一般写作[]T,其中T代表slice中元素的类型;slice的语法和数组很像,只是没有固定长度而已。 slice的扩容: s := []int{1,2,3,4,5} s = append(s, 6) fmt.Println(s) /...阅读全文

博文 2018-09-12 12:34:41 空即是色即是色即是空

LeetCode146 动手实现LRU算法

146. LRU缓存机制 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。 获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。 写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。 进阶: 你是否可以在 O(1) 时间复杂度内完成这两种操作? 示例: LRUCache cache = new LRUCache( 2 /* 缓存容量 */ ); cache.put(1, 1); cache.put(2, 2); cache...阅读全文

博文 2018-10-22 15:34:40 TomorrowWu

Go语言之Defer篇

发自自己的公众号(灰子学技术)。原文链接:https://mp.weixin.qq.com/s/5V0eeDpbe937j-6FtWpRUQ写在前面的话:在接触defer之后,觉得Go的这一特性很好,有点类似于C++的析构函数,不过他们却有很大的不同。主要的区别点是defer实现在函数里面,作用域也是在函数里面,当函数的return语句被调用之后,才会调用到这个defer声明的函数。而析构函数实现在类里面,作用域是在类内部,在该类的实例被销毁的时候,就会被调用到。在谈论defer之前,笔者问了自己三个问题:为什么我们需要defer?如何才能更好的使用它?defer是如何实现的?基于上面的三个问题,笔者做了简单的整理。一.为什么我们需要defer我们在写程序的时候,往往会碰到下面...阅读全文

博文 2019-09-04 09:12:29 ZhDavis

Golang 链表实现约瑟夫算法

Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式:41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。问题是一开始要站在什么地方才能避免自杀?Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。 17世纪的法国数学家加斯帕在《数目的游戏问题》中讲了这样一个故事:15个教徒和15个非教徒在...阅读全文

博文 2020-03-20 13:32:46 左洁

Go源码学习之双向链表

双向链表的定义 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。 这里记录一下自己学习理解的过程 图解 [图片上传失败...(image-afe880-1531019243291)] Go的源码实现 1.首先看一下链表中存储的元素(Element)的定义: // 双向链表的一个元素 type Element struct { // 前驱指针和后继指针 prev, next *Element // 该元素属于哪个链表list list *List // 该元素存储的值 Value interface{} } 2.为Element这个结构体定义...阅读全文

博文 2018-07-08 11:34:42 Popwalker

dive into golang database/sql(2)

当我们拿到一个DB实例之后就可以操作数据库了。本篇我们将更加深入database/sql包,共同探讨连接池的维护和请求的处理。 上一篇我们一起学习了what on earth the DB object is。同时我画了一张图进行说明: DB 上图中很多部分在上一篇中都还没有涉及到,因为sql.Open方法仅仅就是返回这样一个DB对象并新开一个goroutine connectionOpener通过监听openerCh来新建连接。本章我们将更加全面更加深入地介绍DB对象,学习它是如何创建连接并维护连接池的。 从db.Query说起 继续那段最常见的代码: db,_ := sql.Open("mysql", "xxx") rows,_ := db.Query("SELECT age,name ...阅读全文

博文 2017-04-06 03:09:15 suoga

算法学习

## 话题分类 | # | Title | 标题 | | # | Title | 标题 | | :-: | - | :-: | - | :-: | - | :-: | | 1 | [Array](https://github.com/openset/leetcode/tree/master/tag/array/README.md) | [数组](https://github.com/openset/leetcode/tree/master/tag/array/README.md) | | 2 | [Dynamic Programming](https://github.com/openset/leetcode/tree/master/tag/dynamic-programming/READM...阅读全文

博文 2019-01-25 18:01:26 openset

深入理解Go-defer的原理剖析

defer 也是Go里面比较特别的一个关键字了,主要就是用来保证在程序执行过程中,defer后面的函数都会被执行到,一般用来关闭连接、清理资源等。 1. 结构概览 1.1. defer type _defer struct { siz int32 // 参数的大小 started bool // 是否执行过了 sp uintptr // sp at time of defer pc uintptr fn *funcval _panic *_panic // defer中的panic link *_defer // defer链表,函数执行流程中的defer,会通过 link这个 属性进行串联 } 1.2. panic type _panic struct { argp unsafe.Poin...阅读全文

博文 2019-09-06 11:32:46 tyloafer

[leetcode in golang]21、合并两个有序链表

链表分为带哨兵节点和不带哨兵节点。 加入哨兵节点有四个使用场景: 1、创建链表,需要考虑链表为空的情况。 2、遍历链表。 3、特定位置删除/插入节点,判断链表是否为空并且进行操作的节点的前一个节点的状态。 /** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode { if l1==nil{ return l2 } if l2==nil{ return l1 } if l1.Val<=l2.Val{ l1.Next=mergeTwoLists...阅读全文

博文 2019-08-28 11:32:54 反骨奇兵

数据结构——Golang实现堆栈

载请注明出处数据结构——Golang实现堆栈 Golang 1. 栈(stack) 栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线性表。栈是一种数据结构,它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据。栈是只能在某一端插入和删除的特殊线性表。用桶堆积物品,先堆进来的压在底下,随后一件一件往上堆。取走时,只能从上面一件一件取。读和取都在顶部进行,底部一般是不动的。栈就是一种类似桶堆积物品的数据结构,进行删除和插入的一端称栈顶,另一端称栈底。插入一般称为进栈,删除则称为退栈。 栈也称为后进先出表。 2. Golang 实现 2.1. 相关结构体 在这里,我把栈拆分为两个部分,容器和链表,容器用结构体实现,链表用单链表...阅读全文

博文 2019-02-11 16:34:43 ChainZhang

Functional Go: 持久化数据结构简介

函数式编程模型因其天生对并发具备良好的支持,近些年来越来越受到重视。从这篇文章开始, 我将以一个系列的博客来记录函数式编程的一个重要组件:持久化数据结构在 Go 语言下的实现。 这篇文章是系列文章的一部分,如果还没有浏览过文章的其它部分请参考: 持久化数据结构简介 (本文) Vector Trie 的实现 Transient 及持久化 函数式编程不是新概念,像 Haskell、Clojure、Scala 等函数式/类函数式编程语言也已经出现和存在了很长时间, 很多函数式编程的概念现今已经被应用在很多其他领域,比如 Facebook 在 React 的基础上提出的 Flux 应用结构抽象就强调了引入持久化数据结构的好处。 事实上,Facebook 还开源了自己的 JavaScript 持久化数...阅读全文

面试:删除链表的节点

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。 注意:此题对比原题有改动 示例 1: 输入: head = [4,5,1,9], val = 5输出: [4,1,9]解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.示例 2: 输入: head = [4,5,1,9], val = 1输出: [4,5,9]解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9. 说明: 题目保证链表中节点的值互不相同若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点 这题的难度定义为简单,但我觉得如果对于链表题目并不熟练的...阅读全文

博文 2020-03-22 21:32:40 若鱼治水

深入理解Go-defer的原理剖析

Defer 也是Go里面比较特别的一个关键字了,主要就是用来保证在程序执行过程中,defer后面的函数都会被执行到,一般用来关闭连接、清理资源等。 1. 结构概览 1.1. defer type _defer struct { siz int32 // 参数的大小 started bool // 是否执行过了 sp uintptr // sp at time of defer pc uintptr fn *funcval _panic *_panic // defer中的panic link *_defer // defer链表,函数执行流程中的defer,会通过 link这个 属性进行串联 } 复制代码1.2. panic type _panic struct { argp unsafe....阅读全文

博文 2019-09-06 14:36:12 tyloafer

C实现的hash table动态关联数组

动态关联数组中的元素是一系列键值对,实现关联数组的数据结构有binary search tree和hash table。在大多数高级语言中,都有现成的关联数组, 如c++和golang中的std::map和map。这里在c中实现hash table和char* 到 char* 的关联数组。 添加文件hash_tbl.h和hash_tbl.c //hash_tbl.h #ifndef HASH_TBL_H #define HASH_TBL_H #define INIT_BUCKET_NUM 40 typedef struct hash_node{ char *key; char *val; struct hash_node *next; }hash_node; typedef struct h...阅读全文

博文 2019-04-21 16:34:40 Kevin_e8f2

【以太坊源码解析】-区块数据结构

区块数据结构 在区块链中,区块是存储有价值信息的块。这是任何一种加密货币的本质。除此之外,区块还包含一些技术信息,比如它的版本、当前时间戳和前一区块的散列值(哈希值) Block(区块)是Ethereum的核心数据结构之一 * 所有账户的相关活动,以交易(Transaction)的格式存储,每个Block有一个交易对象的列表 * 每个交易的执行结果,由一个Receipt对象与其包含的一组Log对象记录 * 所有交易执行完后生成的Receipt列表,存储在Block中(经过压缩加密) * 不同Block之间,通过前向指针ParentHash一个一个串联起来成为一个单向链表,BlockChain 结构体管理着这个链表 * Block结构体基本可分为Header和Body两个部分 Block: 表...阅读全文

博文 2018-10-15 20:34:38 jincheng828

Java面试中总被问到集合框架怎么办?只要掌握要点轻松录用!

Java的集合类是一些非常实用的工具类,主要用于存储和装载数据 (包括对象),因此,Java的集合类也被称为容器。在Java中,所有的集合类都位于java.util包下,这些集合类主要是基于两个根接口派生而来,它们就是 Collection和 Map。所以集合框架在面试中总会被问到,只要掌握要点轻松录用!小编整理了一些java进阶学习资料和面试题,需要资料的请加JAVA高阶学习Q群:664389243 这是小编创建的java高阶学习交流群,加群一起交流学习深造。群里也有小编整理的2019年最新最全的java高阶学习资料! ​​​​![image.png](https://static.studygolang.com/190107/0ad34bd72a31d3eb4c70fdafd5d5888...阅读全文

博文 2019-01-07 15:10:37 javaGO007

Golang从入门到精通

课程概述Golang从入门到精通,本课程以学习Golang语言开发互联网产品为目标,从基础理论知识入手,详实地讲解Golang语言的开发方法与技巧,并通过大量的线上训练,带领同学们全面掌握服务端高并发、过载保护、水平扩展、服务降级、服务限流以及微服务等主流互联网产品的开发技术栈,快速达到大公司工作两年的技术水平。章节1:Golang环境搭建课时1课程介绍10:08课时2Go的发展历史02:08课时3Go开发环境搭建09:18课时4Go目录结构介绍04:13课时5hello world程序演示16:56课时6Go常用命令介绍09:36课时7Go语言特性13:25章节2:数据类型课时8标识符和关键字04:44课时9变量介绍08:19课时10常量介绍14:21课时11常量练习03:26课时12数据...阅读全文

博文 2019-03-23 02:34:42 瑛子_1791198045

理解 Golang 哈希表 Map 的原理

Home Menu 理解 Golang 哈希表 Map 的原理 09 Mar 2019 哈希表 Map 拉链法 Golang Go实现原理 编译原理 运行时 概述 哈希函数 冲突解决 开放寻址法 拉链法 初始化 结构体 字面量 运行时 操作 访问 写入 扩容 删除 总结 相关文章 Reference 在上一节中我们介绍了 数组和切片的实现原理,这一节会介绍 Golang 中的另一个集合元素 — 哈希,也就是 Map 的实现原理;哈希表是除了数组之外,最常见的数据结构,几乎所有的语言都会有数组和哈希表这两种集合元素,有的语言将数组实现成列表,有的语言将哈希表称作结构体或者字典,但是它们其实就是两种设计集合元素的思路,数组用于表示一个元素的序列,而哈希表示的是键值对之间映射关系,只是不同语言的叫...阅读全文

博文 2019-03-19 12:14:44 draveness.me

数据库大表优化全攻略!!

作者:低至一折起来源:juejin.im/post/5b7d52afe51d453885030b91当MySQL单表记录数过大时,增删改查性能都会急剧下降单表优化除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种复杂度,一般以整型值为主的表在千万级以下,字符串为主的表在五百万以下是没有太大问题的。而事实上很多时候 MySQL 单表的性能依然有不少优化空间,甚至能正常支撑千万级以上的数据量。字段尽量使用 TINYINT、 SMALLINT、 MEDIUM_INT 作为整数类型而非 INT,如果非负则加上 UNSIGNEDVARCHAR 的长度只分配真正需要的空间使用枚举或整数代替字符串类型尽量使用 TIMESTAMP 而非 DATETIME单表不要有太多...阅读全文

博文 2020-05-26 17:36:29 逆风_c69c

golang中的struct

结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体,每个值称为结构体的成员。下面分两方面介绍:一个是基础部分,一个是看一下结构体在实际内存中的内存模型。 1 基础 1.1 定义 type structName typeName {} 1.2 声明 var varName structName 1.3 初始化 type Point struct{ X, Y int } p := Point{1, 2} anim := gif.GIF{LoopCount: nframes} 此创建方式结构体成员顺序不重要。 1.4 new new(structType) new出来的是结构体指针。 1.5 特性 结构体成员相同,顺序不同不是相同结构体类型。 结构体成员以大写字母可以导出,小写的不...阅读全文

博文 2019-07-02 18:32:57 XITEHIP

Golang分页

//分页方法,根据传递过来的页数,每页数,总数,返回分页的内容 7个页数 前 1,2,3,4,5 后 的格式返回,小于5页返回具体页数func Paginator(page, prepage int, nums int64) map[string]interface{} { var firstpage int //前一页地址 var lastpage int //后一页地址 //根据nums总数,和prepage每页数量 生成分页总数 totalpages := int(math.Ceil(float64(nums) / float64(prepage))) //page总数 if page > totalpages { page = totalpages } if page <= 0 { ...阅读全文

博文 2019-05-22 01:34:42 永远de明天

深入理解Go-goroutine的实现及Scheduler分析

在学习Go的过程中,最让人惊叹的莫过于goroutine了。但是goroutine是什么,我们用go关键字就可以创建一个goroutine,这么多的goroutine之间,是如何调度的呢? 1. 结构概览 在看Go源码的过程中,遍地可见g、p、m,我们首先就看一下这些关键字的结构及相互之间的关系 1.1. 数据结构 这里我们仅列出来了结构体里面比较关键的一些成员 1.1.1. G(gouroutine) goroutine是运行时的最小执行单元 type g struct { // Stack parameters. // stack describes the actual stack memory: [stack.lo, stack.hi). // stackguard0 is the ...阅读全文

博文 2019-09-11 17:34:30 tyloafer

带你领略Go源码的魅力----Go内存原理详解

1、内存分区 代码经过预处理、编译、汇编、链接4步后生成一个可执行程序。 在 Windows 下,程序是一个普通的可执行文件,以下列出一个二进制可执行文件的基本情况: 通过上图可以得知,在没有运行程序前,也就是说程序没有加载到内存前,可执行程序内部已经分好三段信息,分别为代码区(text)、数据区(data)和未初始化数据区(bss)3 个部分。 有些人直接把data和bss合起来叫做静态区或全局区。 1、1 代码区(text) 存放 CPU 执行的机器指令。通常代码区是可共享的(即另外的执行程序可以调用它),使其可共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可。代码区通常是只读的,使其只读的原因是防止程序意外地修改了它的指令。另外,代码区还规划了局部变量的相关信息。 1、2...阅读全文

Go Plugin的一个bug

Go 1.8中增加了 plugin package,但是仅支持Linux操作系统,并且还有一些已知的bug。可以说,这个插件系统的实现还未达到"产品级"的水平。 The plugin support is currently incomplete, only supports Linux, and has known bugs. 一些已知的bug已经推到 Go1.10甚至以后的版本中修复了。 今天在测试Go 1.9中的功能的时候就遇到了plugin的一个bug。 按照官方的文档, 开发一个插件很简单: plugin1/main.go1234567package mainimport "fmt"var V intfunc F() { fmt.Printf("Hello, number %d\n...阅读全文

博文 2017-08-27 17:48:36 smallnest

Golang之实现(链表)

链表算法 package main import "fmt" type LinkNode struct { data interface{} next *LinkNode } type Link struct { head *LinkNode tail *LinkNode } func (p *Link) InsertHead(data interface{}) { node := &LinkNode{ data: data, next: nil, } if p.tail == nil && p.head == nil { p.tail = node p.head = node return } } func (p *Link) InsertTail(data interface{}) { ...阅读全文

博文 2018-01-15 07:30:01 pyyu

拜托,面试别再问我回文链表了!!!(leetcode 234)

题目描述 请判断一个链表是否为回文链表。 示例1: 输入: 1->2 输出: false 示例2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题? 解题思路 思路1 遍历链表,用数组存下每个节点的值,然后从数组两头开始向中间遍历,是否相等 时间复杂度O(n),空间复杂度O(n) 思路2 遍历一遍链表,得到链表长度n,根据长度的奇偶,找到中间节点,将左半边的链表反转,然后从中间节点分两个方向向左右两边遍历,是否是回文;对左半部分链表进行反转,还原为最初的链表 只需要固定的若干个临时变量,不需要额外开辟空间 时间复杂度为O(n),空间复杂度为O(1) 代码实现 // ListNode Definition for sing...阅读全文

博文 2018-10-23 20:34:58 tomorrowwu

Go内存分配那些事,就这么简单!

文链接:https://mp.weixin.qq.com/s/3g... 新老朋友好久不见,我是大彬,这篇文章准备了很久,不是在拖延,而是中间做了一些其他事情,耽搁了一些。 这篇文章主要介绍Go内存分配和Go内存管理,会轻微涉及内存申请和释放,以及Go垃圾回收。 从非常宏观的角度看,Go的内存管理就是下图这个样子,我们今天主要关注其中标红的部分。 友情提醒:文章有点长,建议先收藏,后阅读,绝对是学习内存管理的好资料。 本文基于go1.11.2,不同版本Go的内存管理可能存在差别,比如1.9与1.11的mheap定义就是差别比较大的,后续看源码的时候,请注意你的go版本,但无论你用哪个go版本,这都是一个优秀的资料,因为内存管理的思想和框架始终未变。 Go这门语言抛弃了C/C++中的开发者管理...阅读全文

Golang环状队列的实现与应用

一个基于数组的环状队列的实现 队列概念上很简单,就是一个FIFO的数据结构,通常使用链表或者数组来实现,队列在使用方式上只允许从头里面插入,然后从尾部读取,插入和读取的时间复杂度都是0(1) 队列的数据结构 type RingGrowing struct { data []interface{} n int // 初始队列的初始长度 beg int // First available element readable int // Number of data items available } 队列的读取和写入操作 func (r *RingGrowing) ReadOne() (data interface{}, ok bool) { if r.readable == 0 { retu...阅读全文

博文 2019-08-05 20:32:41 路上阳光

tcmalloc 介绍

go的内存管理和tcmalloc(thread-caching malloc)很像,不妨先看看tcmalloc的实现。 tcmalloc是什么tcmalloc是google推出的一种内存分配器,常见的内存分配器还有glibc的ptmalloc和google的jemalloc。相比于ptmalloc,tcmalloc性能更好,特别适用于高并发场景。 tcmalloc具体策略tcmalloc分配的内存主要来自两个地方:全局缓存堆和进程的私有缓存。对于一些小容量的内存申请试用进程的私有缓存,私有缓存不足的时候可以再从全局缓存申请一部分作为私有缓存。对于大容量的内存申请则需要从全局缓存中进行申请。而大小容量的边界就是32k。缓存的组织方式是一个单链表数组,数组的每个元素是一个单链表,链表中的每个元素...阅读全文

博文 2017-07-02 19:24:21 Tao Kelu

k8s与网络--Flannel源码分析

前言 之前在k8s与网络--Flannel解读一文中,我们主要讲了Flannel整体的工作原理。今天主要针对Flannel v0.10.0版本进行源码分析。首先需要理解三个比较重要的概念: 网络(Network):整个集群中分配给 flannel 要管理的网络地址范围 子网(Subnet):flannel 所在的每台主机都会管理 network 中一个子网,子网的掩码和范围是可配置的 后端(Backend):使用什么样的后端网络模型,比如默认的 udp,还是 vxlan 等 源码分析 整体的代码组织如下: 除了可执行文件的入口 main.go之外,有backend,network,pkg和subnet这么几个代码相关的文件夹。 network主要是iptables相关。主要是供main函数根...阅读全文

博文 2018-09-21 16:34:46 iyacontrol

Go实现数据结构--线性表之顺序表

使用golang语言的interface接口类型创建顺序表 package main import "fmt" // 数据结构之线性表--顺序表 type List struct { Len int //线性表长度 Capacity int // 表容量 Prt *[]interface{} // 指向线性表空间指针 } // 初始化 func (l *List) ListInit(capacity int) { l.Capacity = capacity l.Len = 0 m := make([]interface{}, capacity) l.Prt = &m } // 判空 func (l *List) ListIsEmpty() bool { if l.Len == 0 { ret...阅读全文

博文 2020-04-09 21:32:42 阿鸠先生

leetcode 141 判断链表中是否有环

题目描述 给定一个链表,判断链表中是否有环。 进阶: 你能否不使用额外空间解决此题? 解题思路 无环链表,最后一个节点为nil,有环链表可以无限循环next下去 不用额外空间:快慢节点,慢节点一次走一步,快节点一次走两步,当进入环中,每次循环,快节点会离慢节点近一步,快节点最终会追上慢节点 用额外空间: 用map存走过的节点,第一个走过的节点就是环的入口 代码实现 // ListNode Definition for singly-linked list. type ListNode struct { Val int Next *ListNode } func hasCycle(head *ListNode) bool { if head != nil { slow := head fast...阅读全文

博文 2018-10-26 19:34:39 TomorrowWu

Golang LeetCode - 2. Add Two Numbers 两数相加

Add Two Numbers You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list. You may assume the two numbers do not contain any leading zero, except the number 0 itself. Example: Input: (2 -> ...阅读全文

博文 2020-03-31 23:32:58 Avery_up

golang中用链表实现栈

node通过prev字段进行关联,stack维护栈顶节点 stack.go package stack type Stack struct { top *node length int } type node struct { value interface{} prev *node } // 创建一个栈 func New() *Stack { return &Stack{nil, 0} } // 取栈长度 func (s *Stack) Len() int { return s.length } // 查看栈顶元素 func (s *Stack) Peek() interface{} { if s.length == 0 { return nil } return s.top.value ...阅读全文

博文 2019-07-12 20:33:39 ustb80

golang源码学习之panic

这里会涉及到一些defer的知识,有兴趣可以看我的另一篇关于defer的文章 https://www.jianshu.com/p/fec11caadaf6 数据结构 //runtime/runtime2.go type _panic struct { // 调用defer时入参的指针 argp unsafe.Pointer // pointer to arguments of deferred call run during panic; cannot move - known to liblink // panic 的参数 arg interface{} // argument to panic // 指向更早的panic, 新的panic添加到链表头 link *_panic // li...阅读全文

博文 2019-07-23 18:03:26 ihornet

leetcode-23-Merge k Sorted Lists-合并K个排序链表

Merge k Sorted Lists 解题思路 链表两两合并,分而治之 代码-GoLang /** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode { p := list1 q := list2 var head, cur *ListNode var v int for p != nil || q != nil { if p == nil { v = q.Val q = q.Next } else if q == nil ...阅读全文

博文 2020-02-03 19:32:41 帘外五更风

map字典

golang的map实现并不是像c++一样使用红黑树,而是使用了hashmap,用数组来实现。map 是字典的概念,它的格为 “map[keyType]valueType” 。 map 的读取和设置也类似 slice 一样,通过 key 来操作,只是 slice 的index 只能是`int`类型,而 map 多了很多类型,可以是 int ,可以是 string及所有完全定义了 == 与 != 操作的类型。// 1. 声明 var m map[string]int // 2. 初始化,声明之后必须初始化才能使用,向未初始化的map赋值引起 panic: assign to entry in nil map. m = make(map[string]int) m = map[string]in...阅读全文

博文 2018-09-21 11:34:41 周杰伦是李小莹的男神

Go实现双向链表

本文介绍什么是链表,常见的链表有哪些,然后介绍链表这种数据结构会在哪些地方可以用到,以及 Redis 队列是底层的实现,通过一个小实例来演示 Redis 队列有哪些功能,最后通过 Go 实现一个双向链表。 ![链表](https://img.mukewang.com/5d820e2100014a2d20360992.png) ## 目录 - 1、链表 - 1.1 说明 - 1.2 单向链表 - 1.3 循环链表 - 1.4 双向链表 - 2、redis队列 - 2.1 说明 - 2.2 应用场景 - 2.3 演示 - 3、Go双向链表 - 3.1 说明 - 3.2 实现 - 4、总结 - 5、参考文献 ## 1、链表 ### 1.1 说明 ![链表](https://img.mukewang...阅读全文

博文 2019-09-20 09:40:11 link1st

深入理解go的slice和到底什么时候该用slice?

深入理解go的slice和到底什么时候该用slice 前言 用过go语言的亲们都知道,slice(中文翻译为切片)在编程中经常用到,它代表变长的序列,序列中每个元素都有相同的类型,类似一个动态数组,利用append可以实现动态增长,利用slice的特性可以很容易的切割slice,它们是怎么实现这些特性的呢?现在我们来探究一下这些特性的本质是什么。 先了解一下slice的特性 定义一个slice s := []int{1,2,3,4,5} fmt.Println(s) // [1 2 3 4 5] 一个slice类型一般写作[]T,其中T代表slice中元素的类型;slice的语法和数组很像,只是没有固定长度而已。 slice的扩容 s := []int{1,2,3,4,5} s = appe...阅读全文

博文 2018-01-16 10:56:48 sheepbao

深入理解 Go panic and recover

作为一个 gophper,我相信你对于 panic 和 recover 肯定不陌生,但是你有没有想过。当我们执行了这两条语句之后。底层到底发生了什么事呢?前几天和同事刚好聊到相关的话题,发现其实大家对这块理解还是比较模糊的。希望这篇文章能够从更深入的角度告诉你为什么,它到底做了什么事? 原文地址:深入理解 Go panic and recover 思考 一、为什么会中止运行 func main() { panic("EDDYCJY.") } 输出结果: $ go run main.go panic: EDDYCJY. goroutine 1 [running]: main.main() /Users/eddycjy/go/src/github.com/EDDYCJY/awesomeProje...阅读全文

博文 2019-05-21 21:34:37 煎鱼

网站邮箱email地址定向采集核心代码分享

邮箱采集demo:http://www.jsanai.com/emailco...原理: 1、根据要采集的url地址,获取页面html内容,然后采用正则匹配出页面的url列表、邮箱地址列表。 2、获取到url列表及邮箱后分两个异步线程: ①保存邮箱地址; ②分析采集子页面url的邮箱地址; 核心源码(golang): //采集网站地址入口方法 func CollectEmail(hosturl string) (EmailObj, []string, error) { emailObj := new(EmailObj) var inhost []string //获取主域名 uparse, err := url.Parse(hosturl) if err != nil { return *e...阅读全文

博文 2019-10-08 14:02:43 吉山数据