Go语言基础:make,new, len, cap, append, delete方法

前面提到不少go的内建函数,这篇文章学习下如何使用。。 make 先拿 make 开刀,可是一开始我就进入了误区,因为我想先找到他的源码,先是发现 src/builtin/builtin.go 中有 func make(Type, size IntegerType) Type ,可是这里只有两个参数,跟我所了解的 make 是个可变参数不太一样,于是我继续搜索源码包是否还有其它 make 函数原型的声明,但都是徒劳。 于是找度娘,一点信息都没有。还是 google 吧,找了一堆的英文解释,发现两...阅读全文

阅读:8767 评论:0

Golang context 包入门

概述 Golang 的 context Package 提供了一种简洁又强大方式来管理 goroutine 的生命周期,同时提供了一种 Requst-Scope K-V Store。但是对于新手来说,Context 的概念不算非常的直观,这篇文章来带领大家了解一下 Context 包的基本作用和使用方法。 1. 包的引入 在 go1.7 及以上版本 context 包被正式列入官方库中,所以我们只需要import "context"就可以了,而在 go1.6 及以下版本,我们要 import "...阅读全文

2017-02-16 17:02:13 coolbit
阅读:6285 评论:0

Go 1.9 sync.Map揭秘

目录 [−] 有并发问题的mapGo 1.9之前的解决方案sync.MapLoadStoreDeleteRangesync.Map的性能其它 在Go 1.6之前, 内置的map类型是部分goroutine安全的,并发的读没有问题,并发的写可能有问题。自go 1.6之后, 并发地读写map会报错,这在一些知名的开源库中都存在这个问题,所以go 1.9之前的解决方案是额外绑定一个锁,封装成一个新的struct或者单独使用锁都可以。 本文带你深入到sync.Map的具体实现中,看看为了增加一个功能,代...阅读全文

2017年07月11日 smallnest
阅读:6005 评论:2

golang 中 sync.Mutex 和 sync.RWMutex

介绍 golang 中的 sync 包实现了两种锁: Mutex:互斥锁 RWMutex:读写锁,RWMutex 基于 Mutex 实现 Mutex(互斥锁) Mutex 为互斥锁,Lock() 加锁,Unlock() 解锁 在一个 goroutine 获得 Mutex 后,其他 goroutine 只能等到这个 goroutine 释放该 Mutex 使用 Lock() 加锁后,不能再继续对其加锁,直到利用 Unlock() 解锁后才能再加锁 在 Lock() 之前使用 Unlock() 会导...阅读全文

阅读:2142 评论:0

六、protobuf的使用和原理

protobuf详解 1、安装 源码包下载 git clone https://github.com/google/protobuf 安装依赖 sudo apt-get install autoconf automake libtool curl make g++ unzip 生成需要的配置脚本 cd protobuf //进入源码库中 ./autogen.sh //运行脚本生成需要的配置脚本 编译安装 ./configure make make check sudo make install ...阅读全文

2019.01.13 14:38* yongfutian
阅读:1971 评论:0

go的switch case

可以一个case带几个参数: var i = 0 switch i { case 0, 1: fmt.Println(“1”) case 2: fmt.Println(“2”) default: fmt.Println(“def”) } 默认有break效果,要取消就加上fallthrough: var i = 0 switch i { case 0: fallthrough case 1: fmt.Println(“1”) case 2: fmt.Println(“2”) default: f...阅读全文

2019-01-22 13:51:21 梁十八
阅读:4829 评论:0

Go 值传递与引用传递

问题引入 什么时候选择 T 作为参数类型,什么时候选择 *T 作为参数类型? [ ] T 是传递的指针还是值?选择 [ ] T 还是 [ ] *T ? 哪些类型复制和传递的时候会创建副本? 什么情况下会发生副本创建? T 和 *T 当做函数参数时都是传递它的副本 先看传 T 的情况: type user struct { id int name string } func passByValue(_u user){ _u.id++ _u.name="jack" // when printing ...阅读全文

2019-03-18 01:34:39 chencanxin
阅读:1340 评论:1

golang基础之工程结构

golang 简介 很久以前,有一个IT公司,这公司有个传统,允许员工拥有20%自由时间来开发实验性项目。在2007的某一天,公司的几个大牛,正在用c++开发一些比较繁琐但是核心的工作,主要包括庞大的分布式集群,大牛觉得很闹心,后来c++委员会来他们公司演讲,说c++将要添加大概35种新特性。这几个大牛的其中一个人,名为:Rob Pike,听后心中一万个xxx飘过,“c++特性还不够多吗?简化c++应该更有成就感吧”。于是乎,Rob Pike和其他几个大牛讨论了一下,怎么解决这个问题,过了一会,...阅读全文

2019.05.17 10:51 程序员同行者
阅读:3473 评论:0

【Golang】Golang内存逃逸是什么?怎么避免内存逃逸?

为什么要逃逸分析 C/C++中动态分配的内存需要我们手动释放,导致猿们平时在写程序时,如履薄冰。这样做有他的好处:程序员可以完全掌控内存。但是缺点也是很多的:经常出现忘记释放内存,导致内存泄露。所以,很多现代语言都加上了垃圾回收机制。 Go的垃圾回收,让堆和栈对程序员保持透明。真正解放了程序员的双手,让他们可以专注于业务,“高效”地完成代码编写。把那些内存管理的复杂机制交给编译器,而程序员可以去享受生活。 逃逸分析这种“骚操作”把变量合理地分配到它该去的地方,“找准自己的位置”。即使你是用new...阅读全文

2019.08.18 18:43 JinMoon
阅读:2146 评论:0

Go 中for range的一个坑

for range是值拷贝出来的副本 在使用for range的时候,要注意的是,不管是slice还是map,循环的值都是被range值拷贝出来的副本值。 举个简单的例了 package main import "fmt" type Test struct { Index int Num int } func main() { var t []Test t = append(t,Test{Index:1,Num:1}) t = append(t,Test{Index:2,Num:2}) for ...阅读全文

阅读:4879 评论:0

go 指针使用

参考:https://time.geekbang.org/column/article/18042?utm_source=weibo&utm_medium=xuxiaoping&utm_campaign=promotion&utm_content=columns 指针示例: type Dog struct { name string } func (dog *Dog) SetName(name string) { dog.name = name } 对于基本类型Dog来说,*Dog就是它的指针类...阅读全文

2020-01-09 13:00:54 1350368559
阅读:1188 评论:0

介绍一款Go项目热编译工具-gowatch

使用场景 在golang项目编写过程中,需要对项目不断的进行构建go build并调试以快速发现问题,而我们每次进行手动的进行go build又太重复,所以写了这么一个工具gowatch来实时的监听文件的改动并编译。 快速入门 安装使用 go get github.com/silenceper/gowatch 安装完成之后,在main包目录下执行gowatch命令: gowatch 高级用法 支持的命令行参数: -o : 非必须,指定build的目标文件路径 -p : 非必须,指定需要build...阅读全文

阅读:2760 评论:0

【转】golang 三个点省略号的作用总结

原文链接:https://blog.csdn.net/qq_31930499/article/details/98353008 1.使用在数组中 在数组字面量中,如果省略号"..."出现在数组长度的位置,那么数组的长度由初始化数组的元素个数决定。 q := [...]int{1,2,3} fmt.Printf("%T\n",q) //"[3]int" 2.打散Slice package main import ( "fmt" ) func main() { var arr1 []int arr2...阅读全文

2020-03-11 17:33:03 10xjzheng
阅读:1437 评论:0

Golang中的Defer必掌握的7知识点

在用Golang开发的时候,defer这个语法也是必备的知识,但是我们除了知道他是在一个函数退出之前执行,对于defer是否还有其他地方需要注意的呢。 本文整理的defer的全场景使用情况,部分场景源自网络,加上自己的额外观点和分析,完成了这份defer的7个隐性必备知识点。 提纲如下: 知识点1: defer的执行顺序 知识点2:defer与return谁先谁后 知识点3:函数的返回值初始化与defer间接影响 知识点4:有名函数返回值遇见defer情况 知识点5:defer遇见panic 知...阅读全文

阅读:2782 评论:2

golang map的底层实现

golang map的底层实现 粗略的讲,Go语言中map采用的是哈希查找表,由一个key通过哈希函数得到哈希值,64位系统中就生成一个64bit的哈希值,由这个哈希值将key对应到不同的桶(bucket)中,当有多个哈希映射到相同的的桶中时,使用链表解决哈希冲突。 hash函数 首先要知道的就是map中哈希函数的作用,go中map使用hash作查找,就是将key作哈希运算,得到一个哈希值,根据哈希值确定key-value落在哪个bucket的哪个cell。golang使用的hash算法和CPU...阅读全文

2020-04-10 23:32:41 昔召阆梦
阅读:2879 评论:0

go中类型的相等(==)及可比较规则

本文主要参考了The Go Programming Language Specification中的Comparison_operators。加入了自己的一些理解和示例。 如果两个变量是可比较的(使用==或!=),那它们必可以相互赋值。这意味着可比较的两个变量必须是同一类型,或者他们的底层类型相同。 1. 布尔 可比较 2. 整型 可比较 3. 浮点数 可比较 4. 复数 可比较。 5. 字串 可比较 6. 指针值 可比较。 两个指针指向同一个变量,则这两个指针相等,或者两个指针同为nil,它们...阅读全文

2021-02-10 01:32:45 跑马溜溜的球
阅读:2888 评论:0

深度解析sync WaitGroup源码及其实现原理

![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/dd80a6028a66bd592130590f7c1fac58.png#pic_center) # 目录 - WaitGroup介绍 - WaitGroup的实现 - Add - Done - Wait # WaitGroup介绍 `waitGroup` ,也是在go语言并发中比较常用的语法,所以在这里我们一起剖析 waitGroup 的使用方式及其...阅读全文

阅读:1055 评论:0

深度解析sync WaitGroup源码及其实现原理

目录WaitGroup介绍WaitGroup的实现AddDoneWaitWaitGroup介绍waitGroup ,也是在go语言并发中比较常用的语法,所以在这里我们一起剖析 waitGroup 的使用方式及其源码解读。WaitGroup 也是sync 包下一份子,用来解决任务编排的一个并发原语。它主要解决了并发-等待问题:比如现在有三个goroutine,分别为goroutineA,goroutineB,goroutineC,而goroutineA需要等待goroutineB和goroutin...阅读全文

2021-02-26 21:32:33 迈莫coding
阅读:696 评论:0

对一段有关Go Code Block和变量作用域的代码的简要分析

近期,Go team的David CrawShaw在twitter上贴出了一段代码,如下: func main() { if a := 1; false { } else if b := 2; false { } else if c := 3; false { } else { println(a, b, c) } } David CrawShaw想表达的意图是gopher们很少在”else if”后面的simple statement中使用“短变量声明”形式,而这段代码是个例外。我们看到b、c...阅读全文

阅读:3125 评论:2