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

golang面试题整理

golang面试题整理 1、go的调度 2、go struct能不能比较 因为是强类型语言,所以不同类型的结构不能作比较,但是同一类型的实例值是可以比较的,实例不可以比较,因为是指针类型 3、go defer(for defer),先进后出,后进先出 func b() { for i := 0; i < 4; i++ { defer fmt.Print(i) } } 4、select可以用于什么,常用语gorotine的完美退出 golang 的 select 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作 每个case语句里必须是一个IO操作,确切的说,应该是一个面向channel的IO操作 5、context包的用途 Context通常被译作上下文,它是一个比较抽象的概念,其...阅读全文

博文 2019-01-18 23:34:43 yongfutian

golang语言并发与并行——goroutine和channel的详细理解(一)

如果不是我对真正并行的线程的追求,就不会认识到Go有多么的迷人。 Go语言从语言层面上就支持了并发,这与其他语言大不一样,不像以前我们要用Thread库 来新建线程,还要用线程安全的队列库来共享数据。 以下是我入门的学习笔记。 Go语言的goroutines、信道和死锁 goroutine Go语言中有个概念叫做goroutine, 这类似我们熟知的线程,但是更轻。 以下的程序,我们串行地去执行两次loop函数: func loop() { for i := 0; i < 10; i++ { fmt.Printf("%d ", i) } } func main() { loop() loop() } 毫无疑问,输出会是这样的: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 ...阅读全文

博文 2017-03-04 10:44:11 skh2015java

Go 系列教程 —— 21. Go 协程

欢迎来到 [Golang 系列教程](https://studygolang.com/subject/2)的第 21 篇。 在前面的教程里,我们探讨了并发,以及并发与并行的区别。本教程则会介绍在 Go 语言里,如何使用 Go 协程(Goroutine)来实现并发。 ## Go 协程是什么? Go 协程是与其他函数或方法一起并发运行的函数或方法。Go 协程可以看作是轻量级线程。与线程相比,创建一个 Go 协程的成本很小。因此在 Go 应用中,常常会看到有数以千计的 Go 协程并发地运行。 ## Go 协程相比于线程的优势 - 相比线程而言,Go 协程的成本极低。堆栈大小只有若干 kb,并且可以根据应用的需求进行增减。而线程必须指定堆栈的大小,其堆栈是固定不变的。 - Go 协程会复用(Mult...阅读全文

博文 2018-02-03 12:28:28 heyulong

Golang与JAVA比较

普通用法比较 函数func swap(x, y string) (string, string) { var a int = 100 return y, x}a, b := swap("Mahesh", "Kumar")go的方法需要加func入参类型在参数后面,返回类型在入参后面定义类型在变量的后面返回值可以是多个参数函数定义后可作为值来使用java 中的null go中的nilgo中的数组var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}go &a a的地址var ip *intjava的class就是go的structjava中get,set方法 Book1.title = "Go 语言" fmt.Printf( "Book 1 ...阅读全文

博文 2019-01-19 18:34:43 任嘉平生愿

golang sync WaitGroup

刚才看golang的sync的包,看见一个很有用的功能。就是WaitGroup。 先说说WaitGroup的用途:它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成。 WaitGroup总共有三个方法:Add(delta int),Done(),Wait()。简单的说一下这三个方法的作用。 Add:添加或者减少等待goroutine的数量 Done:相当于Add(-1) Wait:执行阻塞,直到所有的WaitGroup数量变成0 例子: package main import ( "fmt" "sync" "time" ) func main() { var wg sync.WaitGroup for i := 0; i < 5; i ...阅读全文

博文 2014-10-04 19:26:12 u011511092

Go语言中的管道(Channel)总结

管道(Channel)是Go语言中比较重要的部分,经常在Go中的并发中使用。今天尝试对Go语言的管道来做以下总结。总结的形式采用问答式的方法,让答案更有目的性。 Q1.管道是什么? 管道是Go语言在语言级别上提供的goroutine间的**通讯方式**,我们可以使用channel在多个goroutine之间传递消息。channel是**进程内**的通讯方式,是不支持跨进程通信的,如果需要进程间通讯的话,可以使用Socket等网络方式。 以上是管道的概念,下面我们就看下管道的语法。 Q2.管道的语法? 整个Go语言的语法都比较简洁,管道也不例外,其语法如下所示: 在此应当注意,管道是类型相关的,即一个管道只能传递一种类型的值。管道中的数据是先进先出的。 1 // 声明方式,在此ElemType...阅读全文

博文 2015-03-25 14:00:59 yetuweiba

Golang 简单理解Channel

什么是channel? channel是Go语言在语言级别提供的goroutine间的通信方式。我们可以使用channel在两个或 多个goroutine之间传递消息。channel是进程内的通信方式,因此通过channel传递对象的过程和调用函数时的参数传递行为比较一致,比如也可以传递指针等。如果需要跨进程通信,我们建议用 分布式系统的方法来解决,比如使用Socket或者HTTP等通信协议。Go语言对于网络方面也有非常完善的支持。 channel是类型相关的。也就是说,一个channel只能传递一种类型的值,这个类型需要在声明channel时指定。如果对Unix管道有所了解的话,就不难理解channel,可以将其认为是一种类 型安全的管道。 (我复制pdf上的。个人理解即是并发编程中各线程...阅读全文

博文 2015-02-09 12:00:07 未来还没来

[go语言] golang的goroutine机制和runtime.GOMAXPROCS

之前对golang的goroutine机制和runtime.GOMAXPROCS不是很理解,今天抽空研究了一下,学习了其他大牛的文章。把自己的理解写下来。如有错误,请指正 golang的goroutine机制有点像线程池: 一、go 内部有三个对象: P对象(processor) 代表上下文(或者可以认为是cpu),M(work thread)代表工作线程,G对象(goroutine). 二、正常情况下一个cpu对象启一个工作线程对象,线程去检查并执行goroutine对象。碰到goroutine对象阻塞的时候,会启动一个新的工作线程,以充分利用cpu资源。所有有时候线程对象会比处理器对象多很多 我们用如下图分别表示P、M、G 在单核情况下,所有goroutine运行在同一个线程(M0)中,...阅读全文

博文 2015-03-08 05:00:01 EthanDorisHope

深度剖析 Go 中的 Go 协程 (goroutines) -- Go 的并发

> Go 协程 (goroutine) 是指在后台中运行的轻量级执行线程,go 协程是 Go 中实现并发的关键组成部分。 在上次的课程中,我们学习了 Go 的并发模型。由于 Go 协程相对于传统操作系统中的线程 (thread) 是非常轻量级的,因此对于一个典型的 Go 应用来说,有数以千计的 Go 协程并发运行的情形是十分常见的。并发可以显著地提升应用的运行速度,并且可以帮助我们编写关注点分离(Separation of concerns,Soc)的代码。 ## 什么是 Go 协程? 我们也许在理论上已经知晓 Go 协程是如何工作的,但是在代码层级上,go 协程何许物也?其实,go 协程看起来只是一个与其他众 Go 协程并发运行的一个简单函数或者方法,但是我们并不能想当然地从函数或者方法中...阅读全文

博文 2019-01-26 22:28:58 hafrans

Golang中使用set

Go中是不提供Set类型,Set是一个集合,set里的元素不能重复。 两种思路 2 basic set implementations 使用map实现 在Golang中通常使用map来实现set,map中的key为唯一值,这与set的特性一致。 简单实现,如下: set := make(map[string]bool) // New empty set set["Foo"] = true // Add for k := range set { // Loop fmt.Println(k) } delete(set, "Foo") // Delete size := len(set) // Size exists := set["Foo"] // Membership map的value值是布...阅读全文

博文 2020-03-26 07:32:40 DevilRoshan

golang 线程与通道

首先我们来看线程,在golang里面也叫goroutine 在读这篇文章之前,我们需要了解一下并发与并行。golang的线程是一种并发机制,而不是并行。它们之间的区别大家可以上网搜一下,网上有很多的介绍。 下面我们先来看一个例子吧 import( "fmt" ) funcmain(){ go fmt.Println("1") fmt.Println("2") } 在golang里面,使用go这个关键字,后面再跟上一个函数就可以创建一个线程。后面的这个函数可以是已经写好的函数,也可以是一个匿名函数 funcmain(){ vari=3 go func(a int) { fmt.Println(a) fmt.Println("1") }(i) fmt.Println("2") } 上面的代码就创...阅读全文

博文 2015-06-17 20:02:17 niechaoya

go runtime.Gosched()的作用分析

untime.Gosched()用于让出CPU时间片。这就像跑接力赛,A跑了一会碰到代码runtime.Gosched()就把接力棒交给B了,A歇着了,B继续跑。 看代码: package main import ( "fmt" "runtime" ) func say(s string) { for i := 0; i < 2; i++ { runtime.Gosched() fmt.Println(s) } } func main() { go say("world") say("hello") } 输出结果: hello world hello 注意结果: 1、先输出了hello,后输出了world. 2、hello输出了2个,world输出了1个(因为第2个hello输出完,主线程就...阅读全文

博文 2015-05-07 10:48:20 baiyuxiong

golang单例模式

1、定义:单例对象的类必须保证只有一个实例存在,全局有唯一接口访问。 2、分类: 懒汉方式:指全局的单例实例在第一次被使用时构建。 饿汉方式:指全局的单例实例在类装载时构建。 3、实现: (1)懒汉方式 1 type singleton struct{} 2 var ins *singleton 3 func GetIns() *singleton{ 4 if ins == nil { 5 ins = &singleton{} 6 } 7 return ins 8 } 缺点:非线程安全。当正在创建时,有线程来访问此时ins = nil就会再创建,单例类就会有多个实例了。 (2)饿汉方式 1 type singleton struct{} 2 var ins *singleton = &sin...阅读全文

博文 2017-10-22 16:00:00 YYRise

图解 Go 并发编程

你很可能从某种途径听说过 Go 语言。它越来越受欢迎,并且有充分的理由可以证明。 Go 快速、简单,有强大的社区支持。学习这门语言最令人兴奋的一点是它的并发模型。 Go 的并发原语使创建多线程并发程序变得简单而有趣。我将通过插图介绍 Go 的并发原语,希望能点透相关概念以方便后续学习。本文是写给 Go 语言编程新手以及准备开始学习 Go 并发原语 (goroutines 和 channels) 的同学。 ## 单线程程序 vs. 多线程程序 你可能已经写过一些单线程程序。一个常用的编程模式是组合多个函数来执行一个特定任务,并且只有前一个函数准备好数据,后面的才会被调用。 ![single Gopher](https://raw.githubusercontent.com/studygolan...阅读全文

博文 2018-07-29 22:11:48 mbyd916

超赞的GO语言设计模式和成例集锦

来自:http://geek.csdn.net/news/detail/100051 Go语言从面世就受到了业界的普遍关注,曾有文章分析,Go是最有可能改变未来IT技术的十大语言之一。本文作者列举了Go语言的设计模式和成例合集,并且还进行了详细的分类。 创建型模式 抽象工厂模式:提供一个接口用于创建相关对象的家族;Builder模式:使用简单的对象来构建复杂的对象;工厂方法模式:一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中;对象池模式:实例化并维护一组相同类型的对象实例;单例模式:限制类的实例,保证一个类只有一个实例。 结构模式 适配器模式:适配另一个不兼容的接口来一起工作;桥接模式:将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立...阅读全文

博文 2016-09-08 06:00:09 Blues1021

Golang百万级高并发实例

前言 感谢Handling 1 Million Requests per Minute with Go 这篇文章给予的巨大启发。 基础 我们使用Go语言,基本上是因为他原生支持的高并发:Goroutine 和 Channel;Go 的并发属于 CSP 并发模型的一种实现;CSP 并发模型的核心概念是:“不要通过共享内存来通信,而应该通过通信来共享内存”。 简单用法 我一开始学习Go语言的时候,遇到大访问量的时候,会先创建一个带缓冲的channel,然后起一个Go协程来逐个读取channel中的数据并处理。说他是并发是因为他没有占用主线程,而是另起了一个协程独自运行。但是这没有实现请求之间的并发。特别注意:Go语言中的map不是并发安全的,要想实现并发安全,需要自己实现(如加锁),或者使用sy...阅读全文

博文 2019-01-16 00:35:11 wz669

Scala与Golang的并发实现对比

并发语言俨然是应大规模应用架构的需要而提出,有其现实所需。前后了解了Scala和Golang,深深体会到现代并发语言与旧有的Java、C++等语言在风格及理念上的巨大差异。本文主要针对Scala和Golang这两个我喜爱的并发语言在并发特性上的不同实现,做个比较和阐述,以进一步加深理解。 一. Scala与Golang的并发实现思路Scala语言并发设计采用Actor模型,借鉴了Erlang的Actor实现,并且在Scala 2.10之后,Scala采用的是Akka Actor模型库。Actor模型主要特征如下: “一切皆是参与者”,且各个actor间是独立的; 发送者与已发送消息间解耦,这是Actor模型显著特点,据此实现异步通信; actor是封装状态和行为的对象,通过消息交换进行相互通...阅读全文

博文 2015-04-24 01:00:38 2gua

golang中的runtime包教程

尽管 Go 编译器产生的是本地可执行代码,这些代码仍旧运行在 Go 的 runtime(这部分的代码可以在 runtime 包中找到)当中。这个 runtime 类似 Java 和 .NET 语言所用到的虚拟机,它负责管理包括内存分配、垃圾回收(第 10.8 节)、栈处理、goroutine、channel、切片(slice)、map 和反射(reflection)等等。 runtime 调度器是个非常有用的东西,关于 runtime 包几个方法: Gosched:让当前线程让出 cpu 以让其它线程运行,它不会挂起当前线程,因此当前线程未来会继续执行 NumCPU:返回当前系统的 CPU 核数量 GOMAXPROCS:设置最大的可同时使用的 CPU 核数 Goexit:退出当前 gorou...阅读全文

博文 2018-08-05 16:34:56 豆瓣奶茶

go语言示例-Timer计时器的用法

计时器用来定时执行任务,分享一段代码: package main import "time" import "fmt" func main() { //新建计时器,两秒以后触发,go触发计时器的方法比较特别,就是在计时器的channel中发送值 timer1 := time.NewTimer(time.Second * 2) //此处在等待channel中的信号,执行此段代码时会阻塞两秒 <-timer1.C fmt.Println("Timer 1 expired") //新建计时器,一秒后触发 timer2 := time.NewTimer(time.Second) //新开启一个线程来处理触发后的事件 go func() { //等触发时的信号 <-timer2.C fmt.Print...阅读全文

博文 2015-03-04 03:00:02 baiyuxiong

Goroutine(协程)为何能处理大并发?

简单来说:协程十分轻量,可以在一个进程中执行有数以十万计的协程,依旧保持高性能。 进程、线程、协程的关系和区别: 进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。 线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。 协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度。 堆和栈的区别请参看:http://www.cnblogs.com/ghj1976/p/3623037.html 协程和线程的区别是:协程避免了无意义的调度,由此可以提高性能,但也因此,程序员必须自己承担调度的责任。 执行协程只需要极少的栈内存(大概是4~5KB),默认情况下,线程栈的大小为1MB。 goroutine就是一段代码,一个函数入口,以及在堆...阅读全文

博文 2015-07-23 12:00:03 nop4ss

【成都腾讯】项目组直招--云计算后台开发工程师

成都腾讯招聘后台开发,希望应聘者具有以下素质: 1 )有丰富的多进程、多线程服务器开发经验 2 )熟悉 c/c++/java/python/go 等至少一种编程语言 3 ) coding 、 debug 能力强(必须) 4 )有开源项目实践经验优先 5 ) 熟悉 docker 、 kubernetes 、 opentack 等技术优...阅读全文

golang的异步API总结

首先是剧透。这篇文章所讲的东西,其实就是golang和erlang里的并行精髓。文中的问题在golang里可以这样解决: ch := make(chan int); go fun(ch chan int) { DoSomething(); ch <- result; }(ch); OtherWork(); MoreOtherWork(); result := <-ch; Herb Sutter 当设计并发APIs的时候,要分离“要做啥”和“如何做”。 Herb Sutter写过不少畅销书,也是软件开发方面的顾问,同时还在Microsoft任软件架构师一职。可以通过www.gotw.ca联系到他。 介绍 让我们从一个已有的同步API函数说起: 例子1:原始的同步API,可能执行时间很长(需要计...阅读全文

博文 2014-11-11 19:00:01 maliro

说说Golang的runtime

runtime包含Go运行时的系统交互的操作,例如控制goruntine的功能。还有debug,pprof进行排查问题和运行时性能分析,tracer来抓取异常事件信息,如 goroutine的创建,加锁解锁状态,系统调用进入推出和锁定还有GC相关的事件,堆栈大小的改变以及进程的退出和开始事件等等;race进行竞态关系检查以及CGO的实现。总的来说运行时是调度器和GC,也是本文主要内容。 阅读全文

博文 2017-06-23 06:11:00 好奇还思猫

Go语言slice的那些坑

Go语言Google开发的适用于多核编程的语言。我感觉它像是C语言的现代版本,简单,并发支持友好,部署轻松。GO语言中保留关键字就只有25个,这也足以说明它的学习成本并不高。 然而,Go语言里面slice这个东西并不简单。初学者容易掉入坑中。此文件就试图把slice给讲解清楚。 下面先讲一下slice的一些基本特性。 1. slice内部有三个变量,分别是:ptr, len, cap ptr是用来存储数据的数组 cap是ptr数组的长度 len是实际数组的长度 2. 如何在初始化的时候,指定slice的长度? a := make([]int, 10) 这里make的时候,第2个参数,就是这个slice的长度。 这个时候它的capacity是多少呢? fmt.Println(cap(a)) 这...阅读全文

博文 2016-03-31 19:00:05 zhanchenxing

Go的内存模型

*/ Golang 官网有一个单独的页面介绍 —— Go的内存模型。me 这里算是将它翻译一下,然后配几个小程序,再加点(个人)说明。me 表示对某些东西也不是太懂,赶脚有些地方有些模糊,甚至有些奇怪。翻译水平有限,不要骂 me,O__O"… 多线程/并发程序共享数据既是一件幸事,却又是一件麻烦的事。对于共享数据的“读”是没有问题的, 问题就出现在“写”上,比如两个进程写同一个内存中的值该如何是好 ? 高级语言的写一个内存变量比如 a = a+1; 往往不会是一个原子操作(不可分割),也就是该操作会拆分成多步...阅读全文

博文 2014-10-24 11:38:52 陆仁贾

Golang的GC信息

一、GC信息的信息收集 设置环境变量GODEBUG=gctrace=1。 使用方法,如果程序为myserver。正常的启动方法为./myserver,如果需要收集GC信息启动方式如下GODEBUG=gctrace=1 ./myserver。 二、GC信息分析 gc5(6): 11+12+357+77 us, 0 -> 1 MB, 4294 (5261-967) objects, 67/2/0 sweeps, 6(115) handoff, 6(9) steal, 170/56/5 yields gc5(6):表示第5次GC,共有6个线程参与GC。 11+12+357+77 us:表示停止各个goroutine花费时间是11us,释放标记对象所有时间为12us,扫描标记可回收对象花费时间为25...阅读全文

博文 2015-03-27 20:00:01 lyhuzi

AlphaGo的论文的译文,关于深度神经网络,蒙特卡洛树搜索:Mastering the game of Go with deep neural networks and tree search

前言: 围棋的英文是 the game of go,标题翻译为:《用深度神经网络和树搜索征服围棋》。译者简介:大三,211,计算机科学与技术专业,平均分92分,专业第一;英文水准:托福 103分,GRE v158 + q167 + AW3.5。为了更好地翻译此文,笔者查看了很多资料。笔者翻译此论文已尽全力,不足之处希望读者指出。 在AlphaGo的影响之下,全社会对人工智能的关注进一步提升。在笔者考完GRE的当天,3月12日,AlphaGo 第三次击败李世石。在3月15日总比分定格为4:1,随后AlphaGo的围棋排名世界来到第二。 论文的英文原文点击这里拜读 编者按:吐槽CSDN的后台服务器,在我用LaTeX编写的公式结尾都加上了一个“|”,比如:公式公式。这真是一个醉人的Bug。2014...阅读全文

博文 2016-03-22 19:00:01 u013390476

测试golang中的多核多线程

"并发 (concurrency)" 和 "并行 ( parallelism)" 是不同的。在单个 CPU 核上,线程通过时间片或者让出控制权来实现任务切换,达到 "同时" 运⾏多个任务的⺫的,这就是所谓的并发。但实际上任何时刻都只有一个任务被执行,其他任务通过某种算法来排队。多核 CPU 可以让同⼀进程内的 "多个线程" 做到真正意义上的同时运,它们之间不需要排队 (依然会发生排队,因为线程数量可能超出 CPU 核数量,还有其他的进程等等。这里说的是一个理想状况),这才是并行。除了多核,并行计算还可能是多台机器上部署运行。 package main import ( "fmt" "runtime" ) func test(c chan bool, n int) { x := 0 for i...阅读全文

博文 2015-12-24 05:00:02 zhjih123

golang 队列和栈的实现

在 python 中实现队列或者栈非常简单,用list就可以用来做一个简单的栈和队列,如下 # 队列操作 queue = [] # 入队 由于有append 我们从列表尾入队 列表头出队 queue.append(1) queue.append(2) queue.append(3) # 现在队列的情况是[1,2,3],可以用list的pop方法出队 queue.pop(0) # 栈的操作跟队列类似 stack = [] # 入栈 stack.append(1) # 出栈和队列的区别在于 都是在列表尾部操作 stack.pop() 那么,在 golang 中我们要怎么实现这种简单的队列和栈呢。这个基本和 python 很类似。 // 初始化 var queue []int var stack ...阅读全文

博文 2019-05-25 00:34:39 咔叽咔叽_

go语言实现线程池

话说真的好久没有写博客了,最近赶新项目,工作太忙了。这一周任务比较少,又可以随便敲敲了。 逛论坛的时候突发奇想,想用go语言实现一个线程池,主要功能是:添加total个任务到线程池中,线程池开启number个线程,每个线程从任务队列中取出一个任务执行,执行完成后取下一个任务,全部执行完成后回调一个函数。 不知道有没有卵用,但是我尝试用它开启3个线程,下载10个文件,效果还是不错的。第一次写这方面的东西,可能写得不好。 思路就是把任务放到channel里,每个线程不停的从channel中取出任务执行,并把执行结果写入另一个channel,当得到total个结果后,回调函数。 上一发代码: 1 type GoroutinePool struct { 2 Queue chan func() err...阅读全文

博文 2015-07-23 03:00:01 wolfred7464

goroutine与调度器

我们都知道Go语言是原生支持语言级并发的,这个并发的最小逻辑单元就是goroutine。goroutine就是Go语言提供的一种用户态线程,当然这种用户态线程是跑在内核级线程之上的。当我们创建了很多的goroutine,并且它们都是跑在同一个内核线程之上的时候,就需要一个调度器来维护这些goroutine,确保所有的goroutine都使用cpu,并且是尽可能公平的使用cpu资源。 这个调度器的原理以及实现值得我们去深入研究一下。支撑整个调度器的主要有4个重要结构,分别是M、G、P、Sched,前三个定义在runtime.h中,Sched定义在proc.c中。 Sched结构就是调度器,它维护有存储M和G的队列以及调度器的一些状态信息等。 M代表内核级线程,一个M就是一个线程,gorouti...阅读全文

博文 2014-11-13 21:58:16 skoo

Golang和nodejs小比拼

​ Golang和nodejs小比拼这期呢,我们来比较一下,golang和nodejs。这两个都是后端比较热门的开发技术。发展的都非常快。 [golang简介]我们先来看一下golang, 这门技术是免费的,可编译的,开源的,面向通用开发的编程语言。这门语言有两位来自谷歌的专家Ken Thompson和Rob Pike所开发, 开发时间是2007年。这门语言跟c语言非常接近, 支持结构定义, 同时又支持垃圾回收处理。内存使用上也更加方便,安全。因为跟c语言很接近,所以golang屏蔽掉了一些现代编程语言中的特征, 比如说类继承是不存在的。[nodejs简介]再来看一下nodejs。这门技术也是开源的。JavaScript作为核心语言, 跨平台。用于创建服务器端实时处理的应用系统。创作者为Ry...阅读全文

博文 2019-08-01 08:32:38 丁哥开讲

golang使用priority queue实现优先级队列

我们知道类似优先级队列是使用heap堆栈来实现的。 优先级队列的用途我就不多说了,一般是用来做任务权重分配的。 下面priority_queue优先级库是在github.com找到的。 看了下他的源代码实现,得知他不是线程安全的。 如果要实现数据的线程安全,需要用sync lock实现全局锁,保证数据的原子性。 该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新。 http://xiaorui.cc/?p=2929 Python #xiaorui.cc package main import ( "fmt" "github.com/gansidui/priority_queue" ) type Node struct { priority int value str...阅读全文

博文 2017-04-04 19:27:17 rfyiamcool

golang协程——通道channel阻塞

新的一年开始了,不管今天以前发生了什么,向前看,就够了。 说到channel,就一定要说一说线程了。任何实际项目,无论大小,并发是必然存在的。并发的存在,就涉及到线程通信。在当下的开发语言中,线程通讯主要有两种,共享内存与消息传递。共享内存一定都很熟悉,通过共同操作同一对象,实现线程间通讯。消息传递即通过类似聊天的方式。golang对并发的处理采用了协程的技术。golang的goroutine就是协程的实现。协程的概念很早就有,简单的理解为轻量级线程,goroutine就是为了解决并发任务间的通信而设计的。golang解决通信的理念是:不要通过共享内存来通信,而应该通过通信来共享内存。golang解决方案是消息传递机制,消息的传递就是通过channel来实现的。 channel的使用很简单,...阅读全文

博文 2016-02-16 03:00:01 xiaofengshuyu

Golang 之协程详解

一、Golang 线程和协程的区别 备注:需要区分进程、线程(内核级线程)、协程(用户级线程)三个概念。 进程、线程 和 协程 之间概念的区别 对于 进程、线程,都是有内核进行调度,有 CPU 时间片的概念,进行 抢占式调度(有多种调度算法) 对于 协程(用户级线程),这是对内核透明的,也就是系统并不知道有协程的存在,是完全由用户自己的程序进行调度的,因为是由用户程序自己控制,那么就很难像抢占式调度那样做到强制的 CPU 控制权切换到其他进程/线程,通常只能进行 协作式调度,需要协程自己主动把控制权转让出去之后,其他协程才能被执行到。 goroutine 和协程区别 本质上,goroutine 就是协程。 不同的是,Golang 在 runtime、系统调用等多方面对 goroutine 调...阅读全文

博文 2019-05-25 10:45:09 liang1101

golang多核设置

单核执行如果for前面或者中间不延迟,主线程不会让出CPU,导致异步的线程无法执行, 从而无法设置flag的值,从而出现死循环 实例代码: package main import ( "fmt" "runtime" _ "time" ) var ( flag = false str string ) func foo() { flag = true str = "setup complete!" } func main() { runtime.GOMAXPROCS(1) go foo() //time.Sleep(1 * time.Second) for { if flag { break } } fmt.Println(str) } 解决办法:1、for中间或者前面加延迟 2、runtim...阅读全文

博文 2015-10-18 21:00:03 webyh

一个java和golang(go语言)通信的例子。

go语言是一个系统级语言,好处非常多。虽然是一个静态编译型语言,但可以像动态语言一样写程序,语言本身可以提供编写应用程序所需的基本组件,而不用引入第三方的包。如果了解c++、java、python等,会对其简洁和强大有更深的认识,c++实在过于繁琐,java也没有想象的简单,python的效率和go不是一个数量级的。那么多的特性,印象最深的就是其对并发的支持,优雅而高效。一般情况下并发通过进程、线程、基于异步IO的回调来实现,进程和线程不能大量的创建,如超过1万个系统资源就不堪重负了,回调可以尽可能少的创建线程,但用法不太符合自然习惯,比如boost 的asio就是一个很好的处理并发的框架,使用得当可以写出高效优雅的服务器程序。而go则在语言级别支持协程,协程是一种轻量级线程,可以创建百万个...阅读全文

博文 2014-10-04 19:26:09 qfsun

Go 语言运行时环境变量快速导览

文: http://dave.cheney.net/2015/11/29/a-whirlwind-tour-of-gos-runtime-environment-variables Go 语言运行时环境变量快速导览 介绍: Go Runtime除了提供:GC, goroutine调度, 定时器,network polling等服务外, 还提供其它一些工具设施,用于开启额外的调试输出, 或是改变Go Runtime自身的一些行为。这些工具设施由传给Go program的一些环境变量控制, 本文主要讲述它们。 GOGC GOGC 是Go Runtime最早支持的环境变量,甚至比GOROOT还早,几乎无人不知。GOGC 用于控制GC的处发频率, 其值默认为100, 意为直到自上次垃圾回收后heap...阅读全文

博文 2016-03-11 17:00:02 htyu_0203_39

Golang 简单的启用一个线程

// code by shaoyongyang package main import ( "fmt" "time" ) func say(s string) { fmt.Println(s) } func main() { go say("who are you?") go say("who are you?1") fmt.Println(2) time.Sleep(1e9) } 好吧,我之前都在想为什么say方法里面没有任何输出,查了很多资料后发现,是因为程序已经结束运行了,启动的线程还在运行。 在最后面加入线程休眠时间就可以了。 启用一个线程仅仅 go say("see i am new thread") ,仅仅使用go关键字即...阅读全文

博文 2015-02-01 08:00:01 未来还没来

给以后的同学攒点golang的面经

只要活着,就不算是悲剧。我们尚在途中,今后仍要继续。——《火花》戳 -> 校招-面经我主要用的还是go,虽然语言不是很重要,但投的基本上是跟go有关的公司,也有一些c++的公司,想往go发展的可以参考我的面经春招春招基本上是过完年回来开始,建议寒假开始复习然后回来就可以找实习了。我春招投的比较晚,后面投的公司不是很多,基本被刷简历,能面试的只有七牛云,然而第一次面试被各种吊打,春招后面去了深圳一家小公司实习了两个月七牛云七牛云的技术还是不错的,虽然实习不想去上海(建议实习不要看地点,实习很短不要介意地点)一面go的调度go struct能不能比较go defer(for defer)select可以用于什么context包的用途client如何实现长连接主协程如何等其余协程完再操作slice...阅读全文

博文 2018-12-07 16:34:51 牛客网

Go和Rust计算性能大比武

作为Go语言的狂热粉丝最近听说了同样鼎鼎大名的现代化语言-Rust,看了介绍后,发现Rust绝对是一门非常有潜力的系统级语言,因此特抽出业务时间进行了学习。 在网上有不少关于Go和Rust的对比文章,但是从我个人的观点来看,这两个语言没有什么好对比的,因为它们的使用场景基本没有重叠之处。Go适合网络编程、软实时系统; Rust适合内存使用苛刻、无GC、超高性能的场景,因此这两门语言如果结合起来,完全是一对非常美好的CP,大家觉得呢? 当然,光说不干空把式,在学Rust途中,笔者肯定会对Go和Rust进行大量的对比和性能测试,这里先来一个多线程下简单计算的对比。 一、启动8个线程(mac笔记本是4核8u),每个线程执行500万次计算任务,然后统计耗时。 首先看Go的代码:package mai...阅读全文

博文 2016-10-07 17:00:00 abv123456789

分享 | 百度网盘高速下载方法汇总

在线免安装类1、在度盘资源分享网址“baidu”后面加上 “wp” 两个字母 这个方法之前介绍过:【工具分享】两个关于度娘的工具,非常不错!能用多久天知道,目前是最简便好用的方法。特点:免登陆,免下载安装软件2、油猴脚本+IDM这个方法第一次下载要先安装一些插件,然后用下载软件就可以实现高速下载。之前也介绍过:你还在吐槽百度网盘的下载速度吗?那就来试试这个吧【视频】百度网盘如何实现高速下载教程特点:免登陆,第一次要麻烦一些,后面就快了。 这个方法也比较好用,稳定性也还不错。关键就是要找对合适的脚本,最笨的方法就是挨个试,如果不行了就换。安装软件类1、速盘https://www.speedpan.com/speedpan-free.html 这款软件采用了Aria2多线程下载,支持免登陆网盘账...阅读全文

博文 2019-07-19 23:32:42 永恒君的百宝箱

Erlang 和Go 的对比

轻量级进程模型:用同步IO的方法写程序的逻辑,第二点是用尽可能多的并发进程来提升IO并发的能力。核心思想,第一:让每个轻量级进程的资源占用更小,创建进程个数的唯一限制便是内存大小。每个进程资源占用越小的内存就能产生越高的并发性,内存资源是宝贵的,反而也是非常廉价的。第二:更轻量级的切换成本,把进程做到用户态,这样切换成本和函数的调用基本在同一个数量级,切换成本非常的低,如果是操作系统切换进程则需要从用户态到核心态再到用户态的切换。轻量级进程的实现原理:进程,进程本质上就是一个栈加上寄存器的状态。进程切换,保存当前的寄存器,让后把寄存器修改为另外一个寄存器状态,这样就是等同于切换了栈,栈的位置其实也是寄存器维持的(esp/ebp)。轻量级进程的底层还是线程池加上异步IO,你可以把这个线程池中的...阅读全文

博文 2017-07-11 07:09:20 lifesoul

golang-map是线程安全的吗?

map 字典(map)它能存储的不是单一值的集合,而是键值对的集合。 什么是键值对?它是从英文 key-value pair 直译过来的一个词。顾名思义,一个键值对就代表 了一对键和值。一个“键”和一个“值”分别代表了一个从属于某一类型的独立值,把它们两个捆绑在一 起就是一个键值对了。在 Go 语言规范中,应该是为了避免歧义,他们将键值对换了一种称呼, 叫做:“键 - 元素对”。 Go 语言的字典类型其实是一个哈希表(hash table)的特定实现。在这个实现中,键和元素的 最大不同在于,键 的类型是受限的,而元素对却可以是任意类型的。 代码: ma := make(map[string]string) ma["key"] = "value"// 存储 value, ok := ma["k...阅读全文

博文 2019-08-29 13:32:47 IT小永

Golang后台开发初体验

补充反馈 slice 既然聊到slice,就不得不提它的近亲array,这里不太想提值类型和引用类型的概念(个人觉得其实都是值类型),golang的array其实可以假想为C的struct类型,只是struct通过变量名来访问成员(如xxx.yyy),而array通过下标来访问成员(如xxx[3]),具体内存布局如下图所示: 图 1 golang的array内存布局 显然golang的array灵活性比较差,长度固定,这才有了slice,概念上有点类似于STL的vector,但是具体实现上还是有差距的,具体内存布局如下图所示: 图 2 golang的slice内存布局 slice类型存在len和cap的概念(与vector类似),这里有一点需要澄清:与vector不一样,slice的len并...阅读全文

博文 2014-10-10 18:00:07 cszhouwei

golang实现AT命令的发送(Windows版)

问题的提出 由于golang的微线程(goroutines)的特征,实现同时交互进行的任务变得自然而容易。一直想实现一个能对手机进行自动发送AT的程序,而实现相应的自动化测试。现在用golang来偿试一下。 问题所依赖的库 使用golang来实现的对串口的操作的库从网上找到了一个,就不用重新发明轮子啦。https://github.com/huin/goserial 在Windows下使用的文件如下: serial.go /* Goserial is a simple go package to allow you to read and write from the serial port as a stream of bytes. It aims to have the same API...阅读全文

博文 2014-10-04 19:26:11 huangliujing

Golang协程调度二:协程切换原理

---- *概述* ---- 协程是Golang中的轻量级线程,麻雀虽小五脏俱全,Golang管理协程时也必然会涉及到协程之间的切换:阻塞的协程被切换出去,可运行的协程被切换进来。我们在本章节就来仔细分析下协程如何切换。 *TLS* thread local storage: *getg()* goget()用来获取当前线程正在执行的协程g。该协程g被存储在TLS中。 *mcall()* mcall在golang需要进行协程切换时被调用,用来保存被切换出去协程的信息,并在当前线程的g0协程堆栈上执行新的函数。一般情况下,会在新函数中执行一次schedule()来挑选新的协程来运行。接下来我们就看看mcall的实现。 ------ *调用时机* ------ *系统调用返回* 当执行系统调用的...阅读全文

博文 2017-12-07 05:45:58 丁凯

go 语言 优势及 主要用途

1、Go有什么优势 可直接编译成机器码,不依赖其他库,glibc的版本有一定要求,部署就是扔一个文件上去就完成了。 静态类型语言,但是有动态语言的感觉,静态类型的语言就是可以在编译的时候检查出来隐藏的大多数问题,动态语言的感觉就是有很多的包可以使用,写起来的效率很高。 语言层面支持并发,这个就是Go最大的特色,天生的支持并发,我曾经说过一句话,天生的基因和整容是有区别的,大家一样美丽,但是你喜欢整容的还是天生基因的美丽呢?Go就是基因里面支持的并发,可以充分的利用多核,很容易的使用并发。 内置runtime,支持垃圾回收,这属于动态语言的特性之一吧,虽然目前来说GC不算完美,但是足以应付我们所能遇到的大多数情况,特别是Go1.1之后的GC。 简单易学,Go语言的作者都有C的基因,那么Go自然...阅读全文

博文 2016-09-05 06:00:47 u013378306

图解Golang的GC算法

虽然Golang的GC自打一开始,就被人所诟病,但是经过这么多年的发展,Golang的GC已经改善了非常多,变得非常优秀了。以下是Golang GC算法的里程碑:v1.1 STWv1.3 Mark STW, Sweep 并行v1.5 三色标记法v1.8 hybrid write barrier经典的GC算法有三种: 引用计数(reference counting)、 标记-清扫(mark&sweep)、 复制收集(CopyandCollection)。Golang的GC算法主要是基于 标记-清扫(markandsweep)算法,并在此基础上做了改进。因此,在此主要介绍一下标记-清扫(mark and sweep)算法,关于引用计数(reference counting)和复制收集(copy ...阅读全文

博文 2019-03-12 13:13:13 互联网技术窝

Golang基于TCP/IP的简单聊天程序

Server.go package main import ( "fmt" "io" "net" "os" "strings" ) func main() { addr, err := net.ResolveTCPAddr("tcp", ":4040") checkErr(err) listen, err := net.ListenTCP("tcp", addr) checkErr(err) fmt.Println("Start server...") for { conn, err := listen.Accept() checkErr(err) go Handle(conn)// 每次建立一个连接就放到单独的线程内做处理 } } const BufLength = 128 var use...阅读全文

博文 2014-12-30 22:00:01 lucifd