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

Golang新手笔记

前言: 最近在学习golang,简单记录归纳了一些常用的语法,希望能够对小白选手有所帮助。 一、25个关键字 break default function interface select case defer go map struct chan else goto package switch const fallthrough if range type continue for import return var 二、变量 var vname type=value //标准定义 var vname1,vname2,vname3 type=v1,v2,v3 var vname1,vname2,vname3 =v1,v2,v3 //简化 vname1,vname2,vname3 :=v1...阅读全文

博文 2019-10-12 20:32:44 aside section ._1OhGeD

Go Context 使用和源码分析

概述 Go语言中的Goroutine是go语言中的最重要的一部分,是一个用户级的线程是Go语言实现高并发高性能的重要原因。但是如何停止一个已经开启的Goroutine呢?一般有几种方法: 使用共享内存来停止goroutine,比如通过判断一个全局变量来判断是否要停止goroutine 使用文件系统来停止goroutine,跟使用内存相同用文件来判断 使用context上下文,context也是大家最推荐的一种方式。并且可以结束嵌套的goroutine。 简单使用 context库中,有4个关键方法: WithCancel 返回一个cancel函数,调用这个函数则可以主动停止goroutine。 WithValue WithValue可以设置一个key/value的键值对,可以在下游任何一个嵌...阅读全文

博文 2019-07-24 17:32:40 大二小的宝

Go 中 recover 与 panic 区别

概念panic 与 recover 是 Go 的两个内置函数,这两个内置函数用于处理 Go 运行时的错误。 panic用于主动抛出错误, recover 用来捕获panic 抛出的错误。 func main() { //捕获 异常 defer func() { if p := recover(); p != nil { fmt.Printf("panic recover! p: %v", p) //类型判断 str, ok := p.(string) if ok { err := errors.New(str) fmt.Println(err) } else { err := errors.New("panic") fmt.Println(err) } } }() fmt.Println("...阅读全文

博文 2019-11-20 21:02:42 风云

如何才能写出正确的程序?

平时我们写程序的时候,总是莫名其妙的出现Bug,一鼓作气的写完一个接口后,经常被队友喷「你怎么一回事?结果与预期不一致啊」 老脸一红,然后一个人藏在角落调试半天,才发现原来是某一个边界条件没处理好,导致Bug重重,今天我们从二分查找算法,来聊聊如何写出正确的程序 像我们熟知的二分查找算法,在1946年就被提出来了,但是到了1962年才出现了完全没有Bug的二分查找法 二分查找法的思想并不复杂,我们很多人张口就能来,但是为什么间隔了辣么多年,才诞生完全没有Bug的二分查找算法呢? 二分查找算法,难就难在边界条件的处理上,我们经常写出Bug,往往也是出现在边界条件没处理好而导致 因为学习一个算法的思想是很简单的,但是让思想落地,写出完全没有Bug的二分查找,却并不是一件容易的事情 所以我们在写程...阅读全文

博文 2019-06-08 23:32:43 闹闹吃鱼

Golang的函数

前言 做开发快二年时间了,但是一般博客发布都在博客园,但是发现简书不能空,所以记录点什么吧,那么就从Golang开始吧。。。。。 Golang函数 //go语言函数和我们大部分语言函数是相同的,但是也有其不同点 //1.定义方法(为什么要用函数,目的的重用代码) func 函数名(参数列表){ //执行的业务逻辑 fmt.Pringln("hello world") } //2.函数的参数(函数参数和js有点相似) func sum(num1 int,num2 int){ fmt.Println(num1,num2) } //3.函数的参数(不定长传参数) func sum1(args ... int){ //这里的args可以任意名字,其字符的类型是切片,所以可以通过for循环获取每一个值...阅读全文

博文 2019-06-13 15:02:54 江世文

golang 学习笔记 1.1 变量

变量 Go 是静态类型语言,不能在运行期改变变量类型。使用关键字 var 定义变量,自动初始化为零值。如果提供初始化值,可省略变量类型,由编译器自动推断。 var x int var f float32 = 1.6 var s = "abc" 在函数内部,可用更简略的 ":=" 方式定义变量。 func main() { x := 123 // 注意检查,是定义新局部变量,还是修改全局变量。该方式容易造成错误。 } 可一次定义多个变量。 var x, y, z int var s, n = "abc", 123 var ( a int b float32 ) func main() { n, s := 0x1234, "Hello, World!" println(x, s, n) } 多变...阅读全文

博文 2019-03-21 14:34:47 Diogoxiang

Golang Basic 2

Golang Basic 2 for Go 只有一种循环结构,for循环 基本的for循环由三部分组成,他们用分号隔开: 初始化语句:在第一次迭代前执行 条件表达式:在每次迭代前求值 后置语句:在每次迭代的结尾执行 初始化语句通常为一句短变量声明,该变量声明仅在for语句的作用域中可见。 一旦条件表达式的布尔值为false,循环迭代就会终止。 注意:和C、Java、JavaScript之类的语言不通,Go中的for语句后面的三个构成部分没有小括号,大括号{}则是必须的。 package main import "fmt" func main() { sum := 0 for i:=0; i < 10; i++ { sum += i } fmt.Println(sum) } 初始化语句和后置语...阅读全文

博文 2019-03-18 23:34:41 Wenchao

Golang之变量去哪儿?

写过C/C++的同学都知道,调用著名的malloc和new函数可以在堆上分配一块内存,这块内存的使用和销毁的责任都在程序员。一不小心,就会发生内存泄露,搞得胆战心惊。切换到Golang后,基本不会担心内存泄露了。虽然也有new函数,但是使用new函数得到的内存不一定就在堆上。堆和栈的区别对程序员“模糊化”了,当然这一切都是Go编译器在背后帮我们完成的。一个变量是在堆上分配,还是在栈上分配,是经过编译器的逃逸分析之后得出的结论。这篇文章,就将带领大家一起去探索逃逸分析——变量到底去哪儿,堆还是栈?什么是逃逸分析以前写C/C++代码时,为了提高效率,常常将pass-by-value(传值)“升级”成pass-by-reference,企图避免构造函数的运行,并且直接返回一个指针。你一定还记得,这...阅读全文

博文 2019-03-02 12:07:25 饶全成

C语言调用GO

C语言调用GO 最近工作中遇到需要在c语言里面调用go语言的需求,总结了一下,下面代码里面的每一个注释都很有用,闲话不多说,直接上代码~ 示例 GO代码: package main // 这个文件一定要在main包下面 import "C" // 这个 import 也是必须的,有了这个才能生成 .h 文件 // 下面这一行不是注释,是导出为SO库的标准写法,注意 export前面不能有空格!!! //export hello func hello(value string)*C.char { // 如果函数有返回值,则要将返回值转换为C语言对应的类型 return C.CString("hello" + value) } func main(){ // 此处一定要有main函数,有main...阅读全文

博文 2019-08-02 18:02:43 silence

go 学习笔记之解读什么是defer延迟函数

Go 语言中有个 defer 关键字,常用于实现延迟函数来保证关键代码的最终执行,常言道: "未雨绸缪方可有备无患". 延迟函数就是这么一种机制,无论程序是正常返回还是异常报错,只要存在延迟函数都能保证这部分关键逻辑最终执行,所以用来做些资源清理等操作再合适不过了. 出入成双有始有终 日常开发编程中,有些操作总是成双成对出现的,有开始就有结束,有打开就要关闭,还有一些连续依赖关系等等. 一般来说,我们需要控制结束语句,在合适的位置和时机控制结束语句,手动保证整个程序有始有终,不遗漏清理收尾操作. 最常见的拷贝文件操作大致流程如下: 打开源文件 srcFile, err := os.Open("fib.txt") if err != nil { t.Error(err) return } 复制...阅读全文

博文 2019-10-18 20:34:21 雪之梦技术驿站

认识 Go 语言中的数组

数组是具有相同唯一类型的一组已编号且长度固定的数据项序列。 声明方式 在 Go 语言中,数组的声明方式为 var identifier [len]type。 声明时没有指定数组的初始化值,因此所有的元素都会被自动初始化为默认值 0。 // 声明一个数组 var a1 [5]int 复制代码Go 语言中的数组是值类型,因此还可以用 new 来创建: var a2 = new([5]int) 复制代码new 返回类型的指针,因此 a1 与 a2 的区别在于:a1 的类型为 [5]int,a2 的类型为 *[5]int。 初始化方法 我们通过在 {} 中填写初始化值来初始化数组。 指明数组长度 指明数组的长度 len,然后在 {} 中填写初始化值,这些值会按下标从小到大的顺序分配。 初始化值的个数...阅读全文

博文 2019-11-21 14:04:20 江不知

03Go 类型总结

Go 类型总结 [TOC] 1、内置类型和内置函数 内置类型: 类型 ⻓度 默认值 说明 bool 1 false 布尔型只有true和false byte 1 0 uint8的别名 rune 4 0 Unicode Code Point, int32别名 int, uint 4 或 8 0 有符号和无符号证书,根据系统可能32 或 64 位 int8, uint8 1 0 -128 ~ 127, 0 ~ 255 int16, uint16 2 0 -32768 ~ 32767, 0 ~ 65535 int32, uint32 4 0 -21亿 ~ 21 亿, 0 ~ 42 亿 int64, uint64 8 0 float32 4 0.0 单精度浮点型 ,小数位:精确到7小数位 float...阅读全文

博文 2019-02-27 12:34:42 杨旭

Golang 关键字

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lengyuezuixue/article/details/79099292 go语言25个关键字总结 ·var和const:变量和常量的声明 ·var varName type 或者 varName := value ·package and import:导入 ·func:用于定义函数和方法 ·return:用于从函数返回 ·defer someCode:在函数退出之前执行 ·go:用于并行 ·select:用于选择不同类型的通讯 ·interface:用于定义接口 ·struct:用于定义抽象数据类型 ·break、case、continue、for、fallthrough、else、if...阅读全文

博文 2019-01-23 10:31:41 lengyuezuixue

Harbor 源码分析 之 Core 组件

core 组件 此文件夹是 harbor 的核心组件。在根目录下有main.go和router.go二个文件。前者用来初始化整个后端项目,后者是对请求的路由处理。在分析一个操作的执行流程时,可以从路由文件入手,一步一步分析。 harbor 中的 controller设计,在common/api文件夹中实现了一个BaseAPI具体实现如下 type BaseAPI struct { beego.Controller } 复制代码这个BaseAPI实现了ControllerInterface接口中的部分方法。在给 harbor 添加新的功能时,此功能对外暴露出来的 API首先需要隐式的继承BaseController结构体,在BaseController结构体中继承了BaseAPI。 以proj...阅读全文

博文 2019-07-15 15:34:56 chenxull

Golang学习笔记-map

map是一些键值对的集合,默认值为nil,使用内置函数make创建map: var map_variable map[key_data_type]value_data_type map_variable := make(map[key_data_type]value_data_type) func main() { var numberMap map[string] int numberMap=make(map[string]int) println(len(numberMap)) } map可以使用大括号来初始化: var numberMap =map[string] int{"one":1,"two":2,"three":3} 判断元素是否存在: func main() { var nu...阅读全文

博文 2019-09-27 23:32:44 aside section ._1OhGeD

GORM之ErrRecordNotFound采坑记录

在我印象中有个错误的认知:如果GORM没有找到record,则会返回ErrRecordNotFound 的错误,知道上次业务中出现了bug,我才发现这个印象中的认知是错误的,且没有官方文档的支持。那么,ErrRecordNotFound 到底在什么时候返回呢,这篇文章将会根据源码来进行分析一下 demo 首先我们先来看一个示例,然后,猜测一下打印的结果 package main import ( "fmt" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" ) type User struct { ID int64 `gorm:"column:id;primary_key" json:"id"` Name s...阅读全文

博文 2019-12-22 16:32:40 tyloafer

Go练习 - PProf分析练习

Introduction 先说一下这次要做什么, 我们每天都需要同步一次本部门人员详细信息. 但是只有两个接口可用: 获取所有人员姓名 根据指定姓名, 查询详细信息的接口 在获得详细信息以后需要筛选出本部门的人员信息, 也就是org字段中包含云部门的数据, 筛选出的数据算是最新人员名单, 对比数据库中已有的数据, 做增量更新(也就是不存在的补上就够了). brain fuck 🖕 我刚拿到这个任务简直无语, 真他妈无聊到批爆 ... fuck! 但是又隐约想起这似乎是我以前遇到过的一个面试题, 简单想想好像没什么嘛, 但是在30万的数量级, daily basis的情况下. 任何微小的浪费都会被放大, 这样一下就有意思了, 能做肯定是能做, 但是怎么做会比较"快", 比较"经济"(不浪费内存...阅读全文

博文 2020-01-16 20:34:17 xiaohan.liang?

Go基础系列:常量和变量

常量(Constants)和iota 常量包含不会发生更改的数据。常量的数据类型只能是boolean、number(int/float/complex)或string。 定义方式: const NAME [TYPE] = VALUE TYPE基本可以省略,因为常量都是简单数据类型,编译器可以根据值推断出它的数据类型。 例如: const Pi = 3.14159 常量在编译期间被评估,因此定义的常量必须是在编译期间就能计算出来的结果。例如调用一些运行期间的函数来生成常量的值就是错误的,因为在编译期间无法调用这些运行期间的函数。常量的值定义好后,无法在运行期间更改,否则会报错。 const c = 3+2 // 正确 const d = getNumber() // 错误 常量的精度可以随意长...阅读全文

博文 2018-11-23 09:09:56 f-ck-need-u

2019-03-07

golang中遇到的坑之 sync.once.do() 源码: func (o *Once) Do(f func()) { if atomic.LoadUint32(&o.done) == 1 { return } // Slow-path. o.m.Lock() defer o.m.Unlock() if o.done == 0 { defer atomic.StoreUint32(&o.done, 1) f() }} 这个方法的定义是,只要f函数被执行一次之后就不会再执行,那么弊端就很明显了,如果f函数执行失败需要重新执行的时候,是不能被满足的。如果需要写单例模式,但是单例初始化依赖于网络或者会出现失败需要重试的时候,还是自己乖乖的用锁来实现吧,不要偷懒用once.d...阅读全文

博文 2019-03-07 19:34:42 小世界_99f6

深入理解Go之generate

概述 开发中经常有定义错误码这样的需求,错误码唯一标识具体的错误信息。另外还需要设置每个错误的具体描述。在 HTTP 协议中,200 表示 "OK",404 表示"Not Found"。在 Linux 系统中,ENOENT 的值为 2,表示"No such file or directory"。syscall包中定义了Errno类型表示系统错误码,非常易用使用,建议去看看。 每次定义错误码的时候,同时需要添加描述信息。而且描述信息经常会忘。本文介绍go generate + stringer工具链优雅地解决这个问题。 这里顺带提一句,golang tools 是官方提供的工具集,是 Gophers 的工具宝库,值得好好探索一番,参见Github 地址,文档地址。里面有丰富的开发辅助工具,所有...阅读全文

博文 2019-08-28 11:32:52 darjun

golang+cgo的搭建以及使用

摘要由于自己新的工作接触到了图像识别,于是开始从零开始整理自己怎么从一个空白到实现识别的完整功能所需要的技术要点。当然并不是完全的从零开始,前提条件至少会用go和c++,go简单很容易就能上手,如果你有开发的工作经验,学习go那是相当容易的。C++相对于go会比较困难点,但是笔者也没有做过c++的经历,也就大学学过c而已,照葫芦画瓢,依然能用的来c++,所以相信大家花点时间也能熟练的使用这两门语言。为什么要cgo所谓的cgo就是go调用c/c++或者是反过来,如果你是一名go开发者,由于现在很多强大的开源库是使用c/c++编写的,比如Opencv、Opengl、Zbar等等,你既想用又不想切换语言,那么cgo就是很好的选择,这将使你站在巨人的肩膀上开发出自己的应用程序。学会cgo将会打开你新...阅读全文

groupcache 源码系列五 peers.go http.go

先上结论: 当客户端连上groupcache时,能做的只有get获取数据,如果本地有所需要的数据,则直接返回,如果没有,则通过一致性哈希函数判断这个key所对应的peer,然后通过http从这个peer上获取数据;如果这个peer上有需要的数据,则通过http回复给之前的那个groupcache;groupcache收到之后,保存在本地hotCache中,并返回给客户端;如果peer上也没有所需要的数据,则groupcache从数据源(数据库或者文件)获取数据,并将数据保存在本地mainCache,并返回给客户端 以上结论对应的源码部分出现在groupcache.go中,暂时不作分析,先来看看peers.go中的内容。 1.NoPeers peers.go默认实现了一个没有peer的结构,也...阅读全文

博文 2019-03-28 21:34:41 懒皮

【Golang 基础】Go 语言中的基本类型

Go 语言中的基础类型   在 Go 编程语言中,数据类型用于声明函数和属性。数据类型的出现时为了把数据分成所需要用大数据的时候才需要申请大内存,这样可以充分的列用内存。 数值类型 布尔型 bool 布尔型的值只可以是常量 true 或者 false,默认值为 false。 字符串类型 string 编码统一为 UTF-8 编码标识 Unicode 文本,默认值为空字符串。 整型(默认值为 0) uint8: 无符号 8 位整型(0 ~ 255); uint16:无符号 16 位整型(0 ~ 65535); uint32:无符号 32 位整型(0 ~ 4294967295); uint64:无符号 64 位整型(0 ~ 18446744073709551615); int8:有符号 8 位整...阅读全文

博文 2019-03-16 11:34:41 龙泷VK

groupchace 源码系列一 consistent hash一致性哈希算法

参考 groupcache源码解析-概览 consistent hash(一致性哈希算法) Memcached大家应该都不陌生,官网的介绍是:Free & open source, high-performance, distributed memory object caching system(免费,开源,高性能的分布式内存对象缓存系统)。很多公司的产品都用到了Memcached,不过Memcached是用C语言开发的,我们的目的是提升Golang技能,所以这里我找了Golang版本的Memcached:groupcache来分析。 github地址:https://github.com/golang/groupcache github上对groupcahe的介绍是:groupcache...阅读全文

博文 2019-03-14 01:34:39 懒皮

golang中的结构体和方法

1. 结构体的定义 声明一个结构体的格式如下 type Node struct { field1 type1 filed2 type2 ... } 2.结构体的声明和初始化 type User struct { name string age int sex string } // 1.var 定义一个结构体类型的变量 var boyd = User // 2. 使用结构体字面量的形式来声明一个结构体类型的变量 ben := User { name: "ben", age: 32, sex: "male", } // 3. 不使用字段名,给结构体字段赋值 tom := {"tom", 33, "male"} // 这中就需要按照字段的顺序给该结构体的字段赋值 3. 嵌套结构 嵌套有名结构体 ...阅读全文

博文 2019-04-03 20:34:39 孤风追影

Golang错误和异常处理的正确姿势

序言 错误和异常是两个不同的概念,非常容易混淆。很多程序员习惯将一切非正常情况都看做错误,而不区分错误和异常,即使程序中可能有异常抛出,也将异常及时捕获并转换成错误。从表面上看,一切皆错误的思路更简单,而异常的引入仅仅增加了额外的复杂度。 但事实并非如此。众所周知,Golang遵循“少即是多”的设计哲学,追求简洁优雅,就是说如果异常价值不大,就不会将异常加入到语言特性中。 错误和异常处理是程序的重要组成部分,我们先看看下面几个问题: 错误和异常如何区分? 错误处理的方式有哪几种? 什么时候需要使用异常终止程序? 什么时候需要捕获异常? ... 如果你对这几个问题的答案不是太清楚,那么就抽一点时间看看本文,或许能给你一些启发。 face-to-exception.png 基础知识 错误指的是可...阅读全文

博文 2018-12-24 18:31:34 u013589865

golang笔记之函数

函数参数传递类型1.按值传递: Go 默认使用按值传递来传递参数,也就是传递参数的副本。 2.引用传递: 如果你希望函数可以直接修改参数的值,而不是对参数的副本进行操作,你需要将参数的地址传递给函数。如果传递给函数的是一个指针,指针的值(一个地址)会被复制,但指针的值所指向的地址上的值不会被复制;我们可以通过这个指针的值来修改这个值所指向的地址上的值。tips:在函数调用时,像切片(slice)、字典(map)、接口(interface)、通道(channel)这样的引用类型都是默认使用引用传递(即使没有显式的指出指针)。几乎在任何情况下,传递指针(一个32位或者64位的值)的消耗都比传递副本来得少。defer函数关键字 defer 允许我们推迟到函数返回的前一刻才执行某个语句或函数。使用场...阅读全文

博文 2019-05-05 18:34:58 月下独酌100

golang+cgo的搭建以及使用

摘要由于自己新的工作接触到了图像识别,于是开始从零开始整理自己怎么从一个空白到实现识别的完整功能所需要的技术要点。当然并不是完全的从零开始,前提条件至少会用go和c++,go简单很容易就能上手,如果你有开发的工作经验,学习go那是相当容易的。C++相对于go会比较困难点,但是笔者也没有做过c++的经历,也就大学学过c而已,照葫芦画瓢,依然能用的来c++,所以相信大家花点时间也能熟练的使用这两门语言。为什么要cgo所谓的cgo就是go调用c/c++或者是反过来,如果你是一名go开发者,由于现在很多强大的开源库是使用c/c++编写的,比如Opencv、Opengl、Zbar等等,你既想用又不想切换语言,那么cgo就是很好的选择,这将使你站在巨人的肩膀上开发出自己的应用程序。学会cgo将会打开你新...阅读全文

Go使用SWIG调用C/C++代码快速入门

简介 SWIG是一个软件开发工具,它将用C和c++编写的程序与各种高级编程语言连接起来(为其他需要生成库)。 准确地说,SWIG生成了两个文件,一个文件是_wrapper.cpp文件,一个是.go文件。*_wrapper.cpp文件将C++接口封装为C接口。go文件通过上一节说的import "C"来引用C接口,并把对这些C接口的调用,封装为不涉及任何C特性的Go函数或方法。 Demo Go使用SWIG的例子 参考资料 项目地址 项目自带Examples 文...阅读全文

博文 2019-10-14 21:32:46 frank2020

go语言1

go的基本命令: go run 快速执行go文件 go build 编译程序 go install 安装可执行文件到bin go test 执行单元测试 go env 显示go环境变量 go fmt 格式化源代码 go 语言: package main //双斜杠为注释,package要放在第一行 import ( //导入fmt包 "fmt" ) func main() { // 在同一个目录下,只允许有一个main包 main函数 fmt.Print("hello world") \\ 打印输出 fmt.Printf("hello world, %d\n",100) \\带有占位符的答应 fmt.Println("hello world") var a int \\定义变量a为int类型...阅读全文

博文 2019-04-01 10:31:03 qq_36811322

go-源码阅读-准备

golang语言写起来很方便,但是如果想把代码写的更好,例如规避gc潜在的问题,节约内存,提升运行性能,都需要对虚拟机做一些了解。这一系列的文章是我再阅读雨痕的《GO语言学习笔记》,记录一些信息。环境go 1.5.1 amd64 ubuntu14.04.3 LTS gdb 7.7.1引导程序启动不是使用main.main函数,之前有命令行处理,运行时初始化工作之后,才会进入用户逻辑。编写一个最简单的helloworld的文件。使用gdb来调试。作者建议平时多使用编译命令行来处理,减少对于IDE的依赖,有利于自己记住这些编译选项。编译的时候使用-gcflags "-N-1" -o test 。使用gdb加载test使用(gdb)info files检查本地可执行文件入口点,直接对这个地址加断点...阅读全文

博文 2020-01-18 15:32:42 阿彪2020

Day 1

题目 下面这段代码输出的内容 package main import ( "fmt" ) func main() { defer_call() } func defer_call() { defer func() { fmt.Println("打印前") }() defer func() { fmt.Println("打印中") }() defer func() { fmt.Println("打印后") }() panic("触发异常") } 题目的主要考察点在defer和golang的异常处理。 defer是golang中的关键字,用于延迟关键字之后函数的执行,这个时机在调用函数返回后。defer常用于清理释放资源、执行 recover。当有多个defer语句时,采取后进先出 LIFO的执...阅读全文

博文 2019-09-29 17:33:29 aside section ._1OhGeD

《go语言圣经》练习3.12

# 题目 **编写一个函数,判断两个字符串是否是相互打乱的,也就是它们有着相同的字符,但是对应不同的顺序** # 代码 ```go package main import ( "fmt" "os" ) func disorder(s1, s2 string) bool { //判断两个字符串是否是相互打乱的 var count1, count2 int //count1 记录两个字符串中是否都有某个字符, //count2 记录若都有这个字符,那么位置是否相等 if len(s1) != len(s2) { //若两个字符串不相等,那么肯定不是相互打乱的 return false } for index1, value1 := range s1 { for index2, value2 :=...阅读全文

博文 2019-07-21 15:58:10 xiayanshangda

bitcount优化之路

**问题:** 使用Go实现bitcount函数,统计一个uint64型数值中被设置为 1 的比特位的数量。 **方案一:** 最容易想到的实现就是每次右移一位,检测最后一位是否是1,这样完成挨个比特检测后,就可以得出结果。 func bitCount1(n uint64)int8{ var count int8 var i uint for i < 64 { if ( (n >> i) & 1) != 0{ count += 1 } i += 1 } return count } var BitCount = bitCount1 实现一个测试函数和一个基准测试函数测试正确性和性能: **测试环境:** 型号名称: MacBook Pro 处理器名称: Intel Core i7 处理器速度...阅读全文

博文 2019-06-30 01:12:08 leeright

区块链教程Fabric1.0源代码分析configtx#ChannelConfig

Fabric 1.0源代码笔记 之 configtx(配置交易) #ChannelConfig(通道配置) 1、ChannelConfig概述 ChannelConfig代码分布在common/config目录下。目录结构如下: channel_util.go,channel相关工具函数。 orderer_util.go,orderer(系统通道)相关工具函数。 application_util.go,应用通道相关工具函数。 consortiums_util.go,联盟相关工具函数。 api.go,核心接口定义,如Org、ApplicationOrg、Channel、Orderer、Application、Consortium、Consortiums、ValueProposer接口定义。 r...阅读全文

博文 2018-10-30 17:34:38 兄弟连区块链

Go语言变量

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念。变量可以通过变量名访问。Go 语言变量名由字母、数字、下划线组成,其中首个字母不能为数字。声明变量的一般形式是使用 var 关键字: var identifier type变量声明第一种,指定变量类型,声明后若不赋值,使用默认值。 var v_name v_typev_name = value第二种,根据值自行判定变量类型。 var v_name = value第三种,省略var, 注意 :=左侧的变量不应该是已经声明过的,否则会导致编译错误。 v_name := value// 例如 var a int = 10 var b = 10c := 10...阅读全文

Golang(四)语言特性(上)

Golang是一种强类型的通用系统编程语言,具有垃圾回收机制并明确支持并发编程。go程序由包构成,这允许对依赖关系进行高效的管理;它的语法规则且紧凑,允许通过诸如集成开发环境之类的自动化工具进行简单的分析.......都是关于Golang语言特性的一些总结,本文将结合官方文档对Golang的语言特性进行一一阐述 记法 使用扩展的Backus-Naur格式(EBNF)指定语法格式,形如 Production = production_name "=" [ Expression ] "." . Expression = Alternative { "|" Alternative } . Alternative = Term { Term } . Term = production_name | ...阅读全文

博文 2019-10-12 01:32:43 aside section ._1OhGeD

爬取珍爱网后用户信息展示

golang爬取珍爱网,爬到了3万多用户信息,并存到了elasticsearch中,如下图,查询到了3万多用户信息。 先来看看最终效果: 利用到了go语言的html模板库: 执行模板渲染: func (s SearchResultView) Render (w io.Writer, data model.SearchResult) error { return s.template.Execute(w, data) } model.SearchResult数据结构如下: type SearchResult struct { Hits int64 Start int Query string PrevFrom int NextFrom int CurrentPage int TotalPage...阅读全文

博文 2019-10-18 10:02:37 小碗汤

Go map原理剖析

在使用map的过程中,有两个问题是经常会遇到的:读写冲突和遍历无序性。为什么会这样呢,底层是怎么实现的呢?带着这两个问题,我简单的了解了一下map的增删改查及遍历的实现。 结构 hmap type hmap struct { // Note: the format of the hmap is also encoded in cmd/compile/internal/gc/reflect.go. // Make sure this stays in sync with the compiler's definition. count int // 有效数据的长度# live cells == size of map. Must be first (used by len() builtin)...阅读全文

博文 2019-10-08 18:32:54 tyloafer

从插入排序来理解 Go 的接口

插入排序 根据插入排序的思想,我们很容易就可以完成插入排序的代码如下。 func insertionSort(data []int) { lo, hi := 0, len(data) - 1 for i := lo + 1; i < hi; i++ { for j := i; j > lo && data[j] < data[j-1]; j-- { data[j], data[j-1] = data[j-1], data[j] } } } 复制代码我们可以验证一下,确实没有问题。 package main import ( "fmt" ) func main() { nums := []int{2, 3, 4, 1, 7, 9, 10, 21, 17} insertionSort(nums)...阅读全文

博文 2019-12-03 11:34:19 咔叽咔叽

Rust 入门 (四)

所有权是 rust 语言独有的特性,它保证了在没有垃圾回收机制下的内存安全,所以理解 rust 的所有权是很有必要的。接下来,我们来讨论所有权和它的几个特性:借用、切片和内存结构。 什么是所有权 Rust 的核心特性是所有权。各种语言都有它们自己管理内存的方式,有些是使用垃圾回收机制,有些是手动管理内存,而 rust 使用的是所有权机制来管理内存。 所有权规则 所有权规则如下: rust 中的每个值都有一个自己的变量。 rust 值在同一时间只能绑定一个变量。 变量超出作用域,值会自动被销毁。 不懂没关系,跳过往后看。 变量作用域 rust 语言的变量作用域和其他语言是类似的,看例子: { // 变量 s 还没有被声明,s 在这里是无效的 let s = "hello"; // 变量 s 是...阅读全文

博文 2019-12-05 15:34:23 单鹏飞

第二章 线程管理

简述 如何启动线程 因启动性程需要一个callable type,可以有函数指针,类重载(),lambda三种形式。 其中类重载(),lambda,有可能会拿到非运行程序的变量,要小心。 启动完成后,需要detach或join,否则程序运行会报错。引入一个thread_guard类。 给线程传参数,会进行拷贝操作。 如果是引用,则要小心变量的作用域。他只会进行拷贝操作,而不会进行转换操作。 如果是类,那么又不需要std::ref。 如果是moveonly的值,在传进去之前要std::move thread 是一个 moveonly的类型,这里介绍了scoped_thread (它是一个线程的'子类') 还有,当 thread t1(xxxx); thread t2(x); t2 = std:...阅读全文

博文 2019-03-30 12:34:40 传说中的水牛

golang中的映射

1. Map 概念:map是一种特殊的数据结构,一种键值对的无序集合。相当于python中的字典 2. 创建和初始化map 使用make声明map dict := make(map[string]int) 使用map字面量的方式声明map dict := map[string]string {"key1": "value1", "key2": "value2"} dict := map[int][]string{} 声明了一个存储字符串切片的map 从map中删除一项 delete(dict, "key1") 删除键为key1的键值对 map在函数间传递是并不会制造该map的一个副本。实际上,当传入一个map给函数时,并对这个map进行修改时,所有对这个map的引用都会察觉到这个修改。 No...阅读全文

博文 2019-04-03 15:34:42 孤风追影

老虞学GoLang笔记-字符串

开发十年,就只剩下这套Java开发体系了 >>> 在所有编程语言中都涉及到大量的字符串操作,可见熟悉对字符串的操作是何等重要。 Go中的字符串和C#中的一样,字符串内容在初始化后不可修改。 需要注意的是在Go中字符串是有UTF-8编码的,请注意保存文件时将文件编码格式改成UTF-8(特别是在windows下)。 初始化 var str string //声明一个字符串 str = "laoYu" //赋值 ch :=str[0] //获取第一个字符 len :=len(str) //字符串的长度,len是内置函数 ,len=5 字符串操作 编码过程中避免不了中文字符,那我们该如何提取一个中文呢?首先我们要知道string[index]获取的是字符byte,就无法像C#中"老虞"[0]来取到‘...阅读全文

博文 2018-09-23 00:33:04 ysqi

golang receiver

type F interface { f()} type S1 struct { myValue int}func (s S1) f() { fmt.Printf("%d\n", s.myValue)}func (s *S1) fpoint() { fmt.Printf("%d\n", s.myValue)}type S2 struct { myValue int}func (s *S2) f() { fmt.Printf("%d\n", s.myValue)}func main() { //1.值传递 val := S1{20} //函数赋值时,初始带入的是第一个隐形参数是val对象本身 //因此这里发生了一次拷贝,当对象本身很大时,不建议使用类型本身作为receiver m := val...阅读全文

博文 2019-10-15 16:14:47 mlzhou

golang reflect 反射包

基础类型描述 Type Kind type Kind uint 基础类型常量 const ( Invalid Kind = iota Bool Int Int8 Int16 Int32 Int64 Uint Uint8 Uint16 Uint32 Uint64 Uintptr Float32 Float64 Complex64 Complex128 Array Chan Func Interface Map Ptr Slice String Struct UnsafePointer ) func String 获取类型字符名称 func (k Kind) String() string intType := reflect.Int typeName := intType.String() /...阅读全文

博文 2019-07-30 03:32:39 直立猿

老虞学GoLang笔记-字符串

开发十年,就只剩下这套Java开发体系了 >>> 在所有编程语言中都涉及到大量的字符串操作,可见熟悉对字符串的操作是何等重要。 Go中的字符串和C#中的一样,字符串内容在初始化后不可修改。 需要注意的是在Go中字符串是有UTF-8编码的,请注意保存文件时将文件编码格式改成UTF-8(特别是在windows下)。 初始化 var str string //声明一个字符串 str = "laoYu" //赋值 ch :=str[0] //获取第一个字符 len :=len(str) //字符串的长度,len是内置函数 ,len=5 字符串操作 编码过程中避免不了中文字符,那我们该如何提取一个中文呢?首先我们要知道string[index]获取的是字符byte,就无法像C#中"老虞"[0]来取到‘...阅读全文

博文 2018-09-23 00:33:06 ysqi

Go map 的特殊特性

零值特性 未初始化的map某些操作是合法的: var testMap map[int]int size := len(testMap) // size is 0 _, present := testMap[0] // present is false non := testMap[123] // non is 0, won't case panic testMap[1] = non // panic: assignment to entry in nil map 只有写入操作才会出 panic。 临时迭代obj的地址问题。 迭代 map 和 slice 等容器的时候,不可使用临时变量的地址!简单的说,这个obj使用的是同一个地址,如果将此变量的地址保存起来,那么将是一个灾难。 代码片段: v...阅读全文

博文 2019-09-03 17:02:44 秦川

HQL之函数使用

在HQL中,我们可以使用关系操作符、数学操作符、逻辑操作符、复合类型操作符以及复合类型构建器。其中,关系操作符、数学操作符和逻辑操作符这三个操作符在HQL的使用方法和大多数高级编程语言,如SQL/Java/Golang,类似。HQL的函数类型总体分为: 数学函数(Mathematical functions) 集合函数(Collection functions) 类型转换函数(Type conversion functions) 日期函数(Date functions) 条件函数(Conditional functions) 字符串函数(String functions) 聚集函数(Aggregate functions) 表生成函数(Table-generating functions) ...阅读全文

博文 2019-10-28 15:32:50 aside section._1OhGeD