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

golang 基础(thirteen)指针

square-gopher.png 数组 定义数组需要指定数组的大小和数组元素的类型 var arr1 [5]int arr2 := [3]int{1,3,5} arr3 := [...]int{2,4,6,8,10} fmt.Println(arr1,arr2,arr3) 定义数组变量如果不给初始值,int 型会默认每一个元素值为 0 使用:= 定义数组需要使用 {} 为素组时给出初始值 也可以在定义数组是让编译器根据初始化复制元素数量来决定数组的长度,[...]来代替[数组长度] golang-5.png 多维数组 var grid [4][5]int 4 个有 5 东西的集合 遍历数组 for i:= 0; i < len(arr3); i++{ fmt.Println(arr3[i]...阅读全文

博文 2019-03-17 20:34:41 zidea

聊一聊堆、栈与Go语言的指针

堆、栈与指针 前言 堆、栈在计算机领域是亘古不变的热门话题,归根结底它们和编程语言无关,都是操作系统层面的内存划分,后面尝试简单地拆开这几个概念,谈谈我对它们的理解。 栈 每个函数中每个值在栈中都是独占的,不能在其他栈中被访问。每个方法片(function frame)都有一个自己的独享栈,这个栈的生命周期随着方法开始结束诞生与消逝,在方法结束时候会被释放掉,较之于堆,栈的优势是比较轻量级,随用随弃,存活期跟随着函数。 堆 通俗的讲,假如说栈是各个函数的一栋私人住宅,堆就是一个大型的人民广场,它可以被共享。堆作为一个全局访问块,它的空间由GC(拆迁大队)管理作。 The heap is not self cleaning like stacks, so there is a bigger c...阅读全文

博文 2020-01-15 12:34:22 pixelpig

Go开发环境搭建

可以在 https://golang.google.cn/dl/ 找到各种系统(支持Windows、MacOS、Linux)的Go安装包。 下载和安装 点击对应的安装包,即可开始自动下载。下载完成后,双击安装包,会出现安装引导页面(如下图所示),点击“继续”逐步安装即可。 开始安装 安装完成后,出现如下页面: 安装完成 查看版本号 在控制台输入go version命令,即可看到当前安装的go开发环境版本: $ go version go version go1.12.1 darwin/amd64 环境变量 sudo vi ~/.bash_profile # 添加如下环境变量 export GOPATH="/usr/local/Cellar/go/1.12.1" export GOBIN="$...阅读全文

博文 2019-06-09 23:02:43 Will_4110

golang调试工具Delve

Devle是一个非常棒的golang 调试工具,支持多种调试方式,直接运行调试,或者attach到一个正在运行中的golang程序,进行调试。 线上golang服务出现问题时,Devle是必不少的在线调试工具,如果使用docker,也可以把Devle打进docker镜像里,调试代码。 安装Devle 安装Devle非常简单,直接运行go get 即可: go get -u github.com/derekparker/delve/cmd/dlv 如果你的go版本为1.5请先设置环境变量GO15VENDOREXPERIMENT=1再运行go get。我的go版本为1.10,不用设置。 使用Devle调试golang服务 先写一个简单的web服务,然后使用Devle来进行调试。 在$GOPATH...阅读全文

博文 2019-11-20 23:33:50 阿泽Aze

golang 碎片整理之 结构体

什么是结构体? 结构体(struct)是用户自定义的类型,它代表若干字段的集合,可以用于描述一个实体对象,类似Java中的class,是golang面向对象编程的基础。结构体的概念在软件工程上的旧术语是ADT(抽象数据类型: Abstract Date type)。在c++它也是存在,并且名字也是struct,在面向对象的编程语言中,跟一个无方法的轻量级类一样。因为在Go语言中没有类的概念,所以在go中结构体有着很重要的地位。 如何定义一个结构体 type Coordinate struct { X,Y float32 } 上述代码定义了一个名为Coordinate的结构体,里面包括了两个float32的变量X,Y。该结构体可用于描述一个平面坐标。 添加对象方法 在go语言中,对象方法在结构...阅读全文

博文 2019-05-04 19:35:40 霍帅兵

Go语言之unsafe

文章转自“灰子学技术”,原文链接:https://mp.weixin.qq.com/s/p4ik3GsM3uGb6yvgVVxMdQ很多同学可能很奇怪,Go不是有指针类型了吗?为啥还需要这样一个unsafe的包呢,关键这个包的名字还是这么的让人不放心,叫做不安全包?而这个包又能够做什么呢,可以帮助我们解决那些问题呢?笔者在学习Go的时候,也被这些问题困扰着,于是便自己整理了这篇文章来讲解下,希望对大家有所帮助。1.指针类型介绍:对于Go语言的指针类型来说,指针类型的限制比较多,主要有四点,并且在Go语言的编译阶段就可以检测出来。限制1: 指针不可以进行数学计算。限制2:不同类型的指针不能够相互赋值。限制3:不同类型的指针不能够==或者!=的比较操作。限制4:不同类型的指针不能够相互转化。备注...阅读全文

博文 2019-12-31 14:45:15 ZhDavis

go语言碎片整理之接口

接口 接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节。 接口类型 在Go语言中接口(interface)是一种类型,是一种抽象的类型。interface是一组method的集合,是duck-type programming的一种体现。接口做的事情就像是定义一个协议(规则),只要一台机器有洗衣服和甩干的功能,我就称它为洗衣机。不关心属性(数据),只关心行为(方法)。为了保护你的Go语言职业生涯,请牢记接口(interface)是一种类型。 为什么要使用接口 package main import ( "fmt" ) type Cat struct{} func (c Cat)Say() string{ return "喵喵喵" } type ...阅读全文

博文 2019-06-27 01:03:08 霍帅兵

golang程序的基本结构和基本数据类型

1.文件名,关键字和标识符 每个golang程序的源文件都是以.go为后缀结尾 golang有25个关键字 break, default, func, interface, select case, defer, go, map, struct, chan else, goto, package, switch, const fallthrough, if, range, type, continue for, import, return, var 标识符使用字母数字下划线,且必须以字母或下划线开头的字符串序列 另外golang中还预定义了35个标识符 append, bool, byte, cap, close, complex, complex64, complex12 copy, f...阅读全文

博文 2019-04-02 23:34:38 孤风追影

关注你所关注的 - Golang社区调研报告

Golang语言可以说现在炙手可热,大家熟悉的Kubernates 就是使用Golang开发的。我们在最近于伦敦和圣地亚哥举行的GopherCon大会上调查了1000多名开发者,以更好地了解Go 开发社区和对Go Module的总体看法。随着最近发布的Go 1.13版本,现在是向社区分享一些有趣数据的好时机。 BTW, 在JFrog,我们也是Go开发者(JFrog CLI和Xray都是用Go编写的)。 同时也是GoLang社区的贡献者, 并为社区维护贡献了公共注册中心 Gocenter(goproxy) https://gocenter.io/. 加速Golang语言开发人员构建速度。 以下是我们学到的一些关键的东西: Go开发人员是高度投入的绝大多数的Go开发者都在使用最新版本的GoLan...阅读全文

博文 2019-12-20 22:33:11 JFrog中国

3.golang与c怕记混 hhh

学了golang感觉 emmmmm 我写c语言变量就忘记了 1.变量的声明 var variable_list optional_data_type; 例如:var a int 2.数组的声明 var variable_name [SIZE] variable_type 数组的初始化 var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0} 3.for for有三种 分别为 for a<5{a++} for a,b:=range[]int[1,2,3,4,5,6] for i=0;i<5;i++ 4.函数 func a(a,b,int) int{} func a() (int,int){} func sum(nums ...int) {...阅读全文

博文 2019-03-02 00:34:40 杜壮昌

Golang备忘 - 01 杂项:零值,接口,自定义包

开发十年,就只剩下这套Java开发体系了 >>> 零值 当一个变量被声明后,系统自动赋予它该类型的零值: int为0,float为0.0,bool为false,string为空字符串,指针为nil 注意:所有内存在Go中都是经过初始化的 接口 1. 在接口上调用方法时: 指针方法可以通过指针调用 值方法可以通过值调用 接收者是值的方法可以通过指针调用,因为指针会首先被解引用 接收者是指针的方法不可以通过值调用,因为存储在接口中的值没有地址 2. 接口方法集调用的规则: 类型*T的可调用方法集包含接收者为*T或T的所有方法集 类型T的可调用方法集包含接收者为T的所有方法 类型T的可调用方法集不包含接收者为*T的方法 3. 内存占用 每个interface{}变量在内存中占据两个字长(32位机的...阅读全文

博文 2018-09-23 01:33:04 nnealguo

Go基础系列:接口类型断言和type-switch

接口类型探测:类型断言 接口实例中存储了实现接口的类型实例,类型的实例有两种:值类型实例和指针类型实例。在程序运行过程中,接口实例存储的实例类型可能会动态改变。例如: // ins是接口实例 var ins Shaper // ins存储值类型的实例 ins = c1 // 一段时间后... ... // ins存储指针类型的实例,存储的类型发生改变 ins = c2 // 一段时间后... // ins可能存储另一个类型实例 ins = s1 所以,需要一种探测接口实例所存储的是值类型还是指针类型。 探测的方法是:ins.(Type)和ins.(*Type)。它们有两个返回值,第二个返回值是ok返回值,布尔类型,第一个返回值是探测出的类型。也可以只有一个返回值:探测出的类型。 // 如果i...阅读全文

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

面向接口 - day 3

type Traversal interface { Traverse() } func main() { traversal := getTraversal() traversal.Traverse() } duck typing 描述事物的外部行为而非内部结构 golang类似duck typing golang中接口是由使用者定义的 实现者只需要实现接口的方法就可以 接口的内部实现 接口中包含实现者的类型和实现者的值/实现者的指针 将实现者赋值给接口变量时有两种方式:值赋值和指针赋值 值赋值是将实现者的值赋给接口的内部变量 指针赋值是将实现者的指针赋值给接口的内部变量 接口的指针赋值只能将实现者的指针赋值给接口变量 接口的值赋值既可以将实现者的指针赋值给接口变量又可以将值赋值给接口变量...阅读全文

2018-09-17

go语言基础 hello world1.常量的定义//常量定义const PI =3.142.一般类型声明type myInt int//数据类型3.全局变量的声明与赋值var myName ="golang"4.结构的声明type myPerson struct {}5.接口的声明type myGolang interface {}6.hello world !func main() {fmt.Println("hello world! 你好世界! ")...阅读全文

博文 2018-09-17 21:34:39 tomato波

11.Go语言基础之接口

接口定义了一个对象的行为规范,接口只定义规范不实现,由具体的对象来实现规范的细节。 1.1接口类型 在Go语言中,接口(interface)是一种类型,一种抽象的类型。 interface是一组method的集合,是duck-type programming的一种体现。 接口做的事情就像是定义一个协议(规则),只要一台机器有洗衣服和甩干的功能,就是洗衣机。不关心属性(数据),只关心行为(方法)。 在Java中,也是有接口的概念的。 1.2为什么要使用接口 package main import "fmt" type Cat struct {} func (c Cat) say() string { return "喵喵喵" } type Dog struct {} func (d Dog) ...阅读全文

博文 2020-02-06 17:33:20 DevOperater

一文理清 Go 引用的常见疑惑

今天,尝试谈下 Go 中的引用。 之所以要谈它,一方面是之前的我也有些概念混乱,想梳理下,另一方面是因为很多人对引用都有疑问。我经常会看到与引用有关的问题。 比如,什么是引用?引用和指针有什么区别?Go 中有引用类型吗?什么是值传递?址传递?引用传递? 在开始谈论之前,我已经感觉到这必定是一个非常头疼的话题。这或许就是学了那么多语言,但没有深入总结,从而导致的思维混乱。 前言 我的理解是,要彻底搞懂引用,得从类型和传递两个角度分别进行思考。 从类型角度,类型可分为值类型和引用类型,一般而言,我们说到引用,强调的都是类型。 从传递角度,有值传递、址传递和引用传递,传递是在函数调用时才会提到的概念,用于表明实参与形参的关系。 引用类型和引用传递的关系,我尝试用一句话概括,引用类型不一定是引用传递...阅读全文

博文 2019-09-28 19:02:39 波罗学

golang中协程与线程的区别

1、goroutine中栈的大小是动态变化的每个os线程都有一个固定大小的栈内存(通常为2MB),栈内存用于保存在其他函数调用期间那些正在执行或临时暂停的函数中的局部变量。而goroutine在生命周期开始时只有一个很小的栈(通常为2KB),goroutine的栈不是固定大小的,它可以按需增大和缩小。所以goroutine能够更高效的使用栈空间。2、goroutine调度os线程是由操作系统内核调度的,所以控制权限从一个线程到另一个线程需要一次完整的上下文切换:即保存一个线程的状态到内存,再恢复另一个线程的状态,最后更新调度器的数据结构。考虑到内存局部性和内存的访问次数,还有访问内存所需的cpu周期数量的增加,这个操作是比较耗时的。go运行时包含一个自己的调度器,采用m:n调度的技术(复用/...阅读全文

博文 2020-01-27 17:32:45 皮斯勒夫

Go并发编程总结

载自:http://www.woola.net/detail/2017-04-27-goroutines.html 本文是一篇并发编程方面的入门文章,以Go语言编写示例代码,内容涵盖: 运行期并发线程(goroutines) 基本的同步技术(管道和锁) Go语言中基本的并发模式 死锁和数据竞争 并行计算 运行期线程 go 关键词后面的语句会以一个新的线程去运行,至于这个线程与java那种线程有什么区别我们后面说明 Go允许使用go语句开启一个新的运行期线程, 即 goroutine,以一个不同的、新创建的goroutine来执行一个函数。 同一个程序中的所有goroutine共享同一个地址空间。 Goroutine非常轻量 ,除了为之分配的栈空间,其所占用的内存空间微乎其微。 并且其栈空间在...阅读全文

博文 2018-12-11 17:31:02 luckytanggu

golang内核系列--深入理解函数闭包

问题闭包 是由函数及其相关引用环境组合而成的实体(即:闭包=函数+引用环境)。“官方”的解释是:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。比如下面“斐波那契数列”闭包:func fib() func() int { a, b := 0, 1 return func() int { a, b = b, a+b return a } } 调用如下 f00 := fib() fmt.Println(f00(), f00(), f00(), f00(), f00()) 输出结果是:1 1 2 3 5 golang里是如何做到这种闭包管理的呢?闭包实现我们先对闭包分3种场景:闭包里没有引用环境(变量生命周期很短,调用完即释放...阅读全文

博文 2019-06-10 14:06:10 buptbill220

Go的内存对齐和指针运算详解和实践

#### uintptr 和 unsafe普及 ##### uintptr 在Go的源码中uintptr的定义如下: ```go /* uintptr is an integer type that is large enough to hold the bit pattern of any pointer. 从英文注释可以看出 uintptr是一个整形,它的大小能够容纳任何指针的位模式,它是无符号的,最大值为:18446744073709551615,怎么来的,int64最大值 * 2 +1 */ type uintptr uintptr ``` **位模式**:内存由字节组成.每个字节由8位bit组成,每个bit状态只能是0或1.所谓位模式,就是变量所占用内存的所有bit的状态的序列 *...阅读全文

博文 2020-01-06 09:12:06 SunPengWei

Go 编程:图解反射

1. 图解反射 在使用反射之前,此文The Laws of Reflection必读。网上中文翻译版本不少,可以搜索阅读。 开始具体篇幅之前,先看一下反射三原则: Reflection goes from interface value to reflection object. Reflection goes from reflection object to interface value. To modify a reflection object, the value must be settable. 在三原则中,有两个关键词 interface value 与 reflection object。有点难理解,画张图可能你就懂了。 先看一下什么是反射对象 reflection ob...阅读全文

go平滑重启调研选型和项目实践

什么是平滑重启 当线上代码需要更新时,我们平时一般的做法需要先关闭服务然后再重启服务. 这时线上可能存在大量正在处理的请求, 这时如果我们直接关闭服务会造成请求全部 中断, 影响用户体验; 在重启重新提供服务之前, 新请求进来也会502. 这时就出现两个需要解决的问题: 老服务正在处理的请求必须处理完才能退出(优雅退出) 新进来的请求需要正常处理,服务不能中断(平滑重启) 本文主要结合linux和Golang中相关实现来介绍如何选型与实践过程. 优雅退出 在实现优雅重启之前首先需要解决的一个问题是如何优雅退出: 一般的思路就是关闭对fd的listen, 确保不会有新的请求进来的情况下处理完已经进入的请求, 并退出程序. 结合Golang中http包中Server的Shutdown的实现来分析...阅读全文

博文 2019-08-19 20:02:41 打瞌睡滴花花

go语言工作笔记

关闭网络连接步骤:1. 直接关闭2. 赋值 nil对与网络连接相关的操作(客户端网络连接、服务器网络连接)都应该: 加锁、解锁```bashconnect *net.Conn // TCP网络连接connectMutex sync.RWMutex // TCP网络连接读写锁使用时:connectMutex.RLock()defer connectMutex.RUnlock()```协程的使用:```bashfor { select { case <-c.ctx.Done(): // 增加退出协程相关操作 return default: } // 增加逻辑代码 // 匿名函数的使用 func(){ // ... }()}```- 注意逻辑代码和业务代码的分层处理,可以抽象的尽量抽象。不要把底层...阅读全文

博文 2019-08-19 20:02:44 Paulin666

Go语言学习笔记03--流程控制循环语句与函数

1.三目运算符 特别注意!在go语言中不存在三目运算符这个东西! 不是不推荐使用,就是完全不存在! 2.循环结构 go语言中有且仅有一种循环结构,就是for循环结构。不存在while或者dowhile这样的循环结构。 for 表达式1;表达式2;表达式3{ 循环体 } 循环的结构与标识符含义几乎与传统c语言相同。 (1)表达式1:循环变量赋初值 (2)表达式2:循环能够继续的循环条件 (3)表达式3:循环变量向着循环结束的方向变化 eg: for num:=0; num<10; num++{ fmt.Println(num); } 注意:go语言中的变量作用域为块级作用域,而不是函数级作用域! 因此定义在for循环内部的变量,其作用域仅能够在for循环内部生效, 因此它们在for循环之外是不...阅读全文

博文 2018-11-30 17:02:11 FrankAdd

golang快速入门[2.2]-go语言开发环境配置-macOS

golang快速入门[2.2]-go语言开发环境配置-macOSmacos安装Go语言开发包配置go语言的开发环境的第一步是要在go官网下载页面下载开发包macOS需要下载pkg后缀文件macOS和iOS操作系统Apple软件包使用.pkg扩展名,在内部使用Xar格式Mac OS 的Go语言开发包是 .pkg 格式的,双击我们下载的安装包即可开始安装,一路点击“继续”即可。双击我们下载好的Go语言开发包即可启动安装程序,如下图所示,这是Go语言的用户许可协议,无需管它,直接勾选“I accept …”然后点击“Next”即可。安装包会默认安装在 /usr/local 目录下,如下所示。这个目录的结构遵守 GOPATH 规则,后面的章节会提到这个概念。目录中各个文件夹的含义如下表所示。目录名说...阅读全文

博文 2020-02-07 19:33:10 jonson_jackson

Golang笔记2--基础语法

Golang笔记2--基础语法 一个大的程序是由很多小的基础构件组成的。变量保存值,简单的加法和减法运算被组合成较复杂的表达式。基础类型被聚合为数组或结构体等更复杂的数据结构。然后使用if和for之类的控制语句来组织和控制表达式的执行流程。然后多个语句被组织到一个个函数中,以便代码的隔离和复用。函数以源文件和包的方式被组织 程序结构 命名 Go命名规则:一个名字必须以一个字母(Unicode字母,所以中文也可)或下划线开头,后面可以跟任意数量的字母、数字或下划线 Keyword: 不能用于自定义名字 break default func interface select case defer go map struct chan else goto package switch const ...阅读全文

博文 2019-08-12 01:02:40 开发心情不好

golang学习笔记(一)——golang基础和相关数据结构

小白前端一枚,最近在研究golang,记录自己学习过程中的一些笔记,以及自己的理解。 go中包的依赖管理 go中的切片 byte 和 string go中的Map go中的struct结构体 go中的方法 go中的interface接口 interface{} 原文在我的博客中:https://github.com/forthealll... 欢迎star~ 1、go中包的依赖管理 首先要了解的是GOPATH的含义,GOPATH是go命令依赖的重要变量,可以通过: go env 来查看相应的开发环境中GOPATH的值,也可以通过export GOPATH指定: export GOPATH = /usr/local/go 指定GOPATH目录后, GOPATH目录包含了3个子目录: src存放...阅读全文

博文 2018-12-26 15:34:44 yuxiaoliang

Go基础系列:构建go程序

hello world 从一个简单的程序开始解释,将下面的内容放进test.go文件中,路径随意: package main import ( "fmt" ) func main() { fmt.Println("Hello World") } Go通过包的方式管理程序,每个Go源代码文件都必须声明自己所在的包,正如上面的package main声明自己所在的包是main包。 每个程序都必须有一个main包,main包作为整个程序的编译入口包,main包中的main()函数作为程序的执行入口。 import关键字用来导入其它包,导入某个包之后就能在当前文件中使用这个包中的函数,例如上面的main包导入fmt包后,可以使用fmt包中的函数Println()。 然后可以使用go的build工具编...阅读全文

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

golang逃逸分析

带GC语言给我们程序的编写带来了极大的便利,但是与此同时屏蔽了很多底层的细节,比如一个对象是在栈上分配还是在堆上分配。对于普通的代码来说虽然不需要关心这么多,但是作为强迫症程序猿,还是希望能让自己写出来的代码性能最优,所以还是需要了解什么是逃逸,以及如何判断是否发生了逃逸。 什么是堆和栈? 首先需要知道,我们说的堆和栈是啥。这个可不是数据结构里面的"堆"和"栈",而是操作系统里面的概念。 栈 在程序中,每个函数块都会有自己的内存区域用来存自己的局部变量(内存占用少)、返回地址、返回值之类的数据,这一块内存区域有特定的结构和寻址方式,大小在编译时已经确定,寻址起来也十分迅速,开销很少。这一块内存地址称为栈。栈是线程级别的,大小在创建的时候已经确定,所以当数据太大的时候,就会发生"stack o...阅读全文

博文 2019-08-12 10:33:49 PureWhiteWu

学习使用 Go 的反射

什么是反射 大多数时候,Go中的变量,类型和函数非常简单直接。当需要一个类型、变量或者是函数时,可以直接定义它们: type Foo struct { A int B string } var x Foo func DoSomething(f Foo) { fmt.Println(f.A, f.B) } 但是有时你希望在运行时使用变量的在编写程序时还不存在的信息。比如你正在尝试将文件或网络请求中的数据映射到变量中。或者你想构建一个适用于不同类型的工具。在这种情况下,你需要使用反射。反射使您能够在运行时检查类型。它还允许您在运行时检查,修改和创建变量,函数和结构体。 Go中的反射是基于三个概念构建的:类型,种类和值(Types Kinds Values)。标准库中的reflect包提供了 Go...阅读全文

博文 2020-01-19 11:32:41 Kevin

Go36-27,28-条件变量

条件变量 条件变量(conditional variable),和互斥锁一样,也是一个同步工具。我们常常会把条件变量与互斥锁一起讨论。实际上,条件变量是基于互斥锁的,它必须有互斥锁的支撑才能发挥作用。 作用 条件变量并不是被用来保护临界区和共享资源的,它是用于协调想要访问共享资源的那些线程的。当共享资源的状态发生变化时,它可以被用来通知被互斥锁阻塞的线程。 使用条件变量的最大优势就是在效率方面的提升。当共享资源的状态不满足条件的时候,想操作它的线程再也不用循环往复的做检查了,只要等待通知就好了。 使用条件变量 条件变量需要与互斥锁配合使用。条件变量的初始化需要互斥锁,并且它的方法有的也是基于互斥锁的。 条件变量提供的方法有三个: 等待通知(wait) 单发通知(signal) 广播通知(br...阅读全文

博文 2019-01-27 07:35:12 骑士救兵

Go 中的黑桃 A:使用结构体创建命名空间

假设,但不是凭空想象,在你的程序中,你注册了一堆 [expvar 包的统计变量](https://golang.org/pkg/expvar/),用来在暴露出去的 JSON 结果中能有一个容易辨识的名字。普通的实现方式下,你可能会有一大堆全局变量,对应着程序追踪的各种信息。这些变量与其他的全局变量混成一团,这毫无美感,如果我们能规避这种情况,那么事情会变得不那么糟糕。 归功于 Go 对匿名结构类型的支持,我们可以实现。我们可以基于匿名结构类型创建一个变量集合的命名空间: ```go var events struct { connections, messages [expvar.Int](expvar.Int) tlsconns, tlserrors [expvar.Int](expvar...阅读全文

博文 2020-01-27 12:01:08 lxbwolf

Go进阶:反射3定律

各位学习Go语言的朋友,周末好,这次跟大家聊一聊Go语言的一个高级话题:反射。 这篇文章是从我过去的学习笔记修改来的,内容主要来自Go Blog的一篇文章《The law of reflection》。 这篇文章主要介绍反射和接口的关系,解释内在的关系和原理。 反射来自元编程,指通过类型检查变量本身数据结构的方式,只有部分编程语言支持反射。 类型 反射构建在类型系统之上,Go是静态类型语言,每一个变量都有静态类型,在编译时就确定下来了。 比如: type MyInt int var i int var j MyInt i和j的底层类型都是int,但i的静态类型是int,j的静态类型是MyInt,这两个是不同类型,是不能直接赋值的,需要类型强制转换。 接口类型比较特殊,接口类型的变量被多种对象...阅读全文

博文 2019-02-25 19:34:41 大彬

golang协程池tunny源码解析

tunny github地址:https://github.com/Jeffail/tunny 项目结构 tunny的项目结构非常简单,核心文件就是tunny.go与worker.go 整体分析 tunny主要是通过reqChan管道来联系pool与worker之间的关系,worker的数量与协程池的大小相等,在初始化协程池时决定;各个worker竞争地获取reqChan中的数据,然后处理,最后返回给pool; 代码详解 type Pool struct { queuedJobs int64 ctor func() Worker workers []*workerWrapper reqChan chan workRequest workerMut sync.Mutex } Pool结构体: ...阅读全文

博文 2020-01-25 19:32:38 byte

Go总结(2)

struct go中struct结构默认字段都会有零值,故不能用nil来判断struct是否为空,可通过额外的字段来判断struct是否填充或为空 type Demo struct{ ready bool name string //其他字段 } 在初始化的时候必须将ready设置为true var d Demo if !d.ready{ //do stuff } Web工作方式 Go通过ListenAndServer来建立web服务器,底层是初始化一个server对象,然后调用net.Listen("tcp",addr)来监听端口。 调用srv.server(net.Listener)函数来处理接收客户端请求。函数里面为一个for{},首先通过accept接受请求,接着创建一个Conn,最...阅读全文

博文 2019-01-22 18:34:42 dack

golang容易掉进的坑(一)

案例一 switch-case会自动结束 下面这段代码会出现什么结果呢? func test(a int) string { switch a { case 4: case 3: return "hit" } panic("noooo") } func main() { fmt.Println(test(4)) } image.gif 如果在其它语言中,结果是打印出hit并结束程序,而在golang中将会产生panic异常! 原因是golang会在每个case结束时自动break掉,因此a=4时并不会return "hit"而是什么也不做。 对于这一点官方的解释是: Go 的 switch 语句类似于 C、C++、Java、JavaScript 和 PHP 中的,不过 Go 只运行选定的 c...阅读全文

博文 2019-06-27 20:02:39 陀氏

centos下安装golang环境

一直使用windows作为开发环境。 现在尝试一下使用腾讯云服务器的centos7.5的linxu云服务器搭建golang环境 第一步 在golang中文社区的下载中获取地址:https://studygolang.com/dl 选择linux image.png 使用wget命令行下载安装包到linux wget https://studygolang.com/dl/golang/go1.12.linux-amd64.tar.gz 现在完成之后解压到/usr/local tar -C /usr/local -xzf go1.12.linux-amd64.tar.gz 打开环境变量文件 vi /etc/profile 在环境变量最后添加GOROOT环境变量,GOROOT变量为go的安装目录,...阅读全文

(十三)golang 逃逸分析

Golang逃逸分析 介绍逃逸分析的概念,go怎么开启逃逸分析的log。 以下资料来自互联网,有错误之处,请一定告之。 sheepbao 2017.06.10 什么是逃逸分析 wiki上的定义 In compiler optimization, escape analysis is a method for determining the dynamic scope of pointers - where in the program a pointer can be accessed. It is related to pointer analysis and shape analysis. When a variable (or an object) is allocated in a ...阅读全文

博文 2019-07-01 20:33:01 杰克慢

golang关键字

break :中断本层循环,直接退出本层循环 case :一般与switch一起做条件选择,还可以与select结合使用 chan :信道定义 const :常量声明 continue:中断本次循环,进入下一次循环 default:与switch一起使用设置默认值 func :定义方法(函数)的关键字 defer :方法最后执行的操作,新定义的后执行 go:开启go-routine else:与if以前做条件筛选 goto:转向指定代码模块 fallthrough:与switch一起继续执行下面的case条件 if:条件判断 for:循环语句关键字 import:导入依赖包 interface :接口类型 map :map集合类型 key-value存储 package:包名定义关键字 pa...阅读全文

博文 2019-02-26 13:34:43 歼灭bug

golang template模版如何判断变量是否存在/指针是否为空

golang template模版如何判断变量是否存在/指针是否为空 也就是语法{{if .Var}}的含义。 其含义是变量Var是否为真值,判断逻辑根据变量的类型,和golang语言本身判断变量是否为真的逻辑是一样的。 数字型:值不等于零 字符串:不是空串 指针类型:不为空 布尔类型:为True值 比较常用的是指针类型是否为空(对于其他基本类型来说,可以通过简单的比较运算来完成),语义上说就是属性是否存在,举个例子来说: package main import ( "os" "log" "text/template" ) type Address struct { City string Street string Apt int } func main() { templateText ...阅读全文

博文 2020-01-06 05:32:43 CodingCode

golang 基础

JUST笔记 Go语言主要特性 自动垃圾回收(Python: so easy?) 丰富内置类型(Python: I don't think so) 函数多返回值(Python: I can) 错误处理(Python:are you sure?) 匿名函数和闭包(Python: give me something new?) 类型和接口(Python: Not bad!) 并发编程(Python: Yes, double click & 666) 反射(I do not use and I do not know) 语言交互性(Python: Now, I just found I like you) Let's say "Hello World!" package main // you k...阅读全文

博文 2019-08-28 11:32:46 JM68

go语言工厂模式

作者:HaigLee https://www.jianshu.com/u/67ec21fb270d 本文由 HaigLee 发布。未经许可,禁止转载。 1. 说明 Golang 的结构体没有构造函数,通常可以使用工厂模式来解决这个问题。 2. 需求示例 一个结构体的声明: package model type Student struct{ Name string ... } 因为这里的Student 的首字母S是大写的,如果我们想在其它包括创建Student 的实例(比如main包),引入model 包后,就可以直接创建Student 结构体的变量(实例)。但是问题来了,如果首字母是小写的,比如是: type student struct{ ... } 那么直接使用就不行了,这时候该怎么办...阅读全文

博文 2019-12-30 02:32:37 HaigLee

撮合引擎开发:流程的代码实现

欢迎关注「Keegan小钢」公众号获取更多文章 撮合引擎开发:开篇 撮合引擎开发:MVP版本 撮合引擎开发:数据结构设计 撮合引擎开发:对接黑箱 撮合引擎开发:解密黑箱流程 撮合引擎开发:流程的代码实现 程序入口 我们要开始聊代码实现逻辑了,如果不记得之前讲的目录结构,请回去翻看前文。聊代码实现的第一步自然从程序入口开始,核心就两个函数:init() 和 main(),其代码如下: package main ... //other codes func init() { initViper() initLog() engine.Init() middleware.Init() process.Init() } func main() { mux := http.NewServeMux() m...阅读全文

博文 2019-12-02 12:34:14 Keegan小钢

Golang学习笔记-条件语句,循环语句

Go的条件语句,循环语句和C很像,不同的是Go的条件表达式可以不用括号扩起来,除此之外还有这些不同: switch语句 switch分支中的代码执行完后会跳出switch代码块,如果我们需要执行后面的 case,可以使用fallthrough。 func main() { a:=1 switch a { case 0: fmt.Println("a is 0") case 1: fmt.Println("a is 1") fallthrough case 2: fmt.Println("a is 2") } } 结果: a is 1 a is 2 switch支持任何类型的判断,例如下面的string: func main() { var fruitName="apple" switch f...阅读全文

博文 2019-09-27 23:33:01 aside section ._1OhGeD

GoLang - 数组(Array)

GoLang 提供了数组类型的数据结构。数组是 GoLang 编程中最常用的数据结构之一,指同一类型数据的有序集合。数组中包含的每个数据称为元素,一个数组包含的元素总数称为数组的长度。   GoLang 中的数组具有以下特点: 固定性——长度固定,无法扩容。 有序性——所有元素都有固定的整数下标(编号),第一个元素的下标为 0 。 数组声明   GoLang 中声明数组的语法如下: var variable_name [SIZE] variable_type   以上为一维数组的定义方式。   例如以下定义了长度为 10 ,类型为 float32 的数组 nums : var nums [10] float32   常用的多维数组可以这样定义: var variable_name [SIZE...阅读全文

博文 2019-07-24 10:32:57 凉丶心园

2020新春tensorflow 7 七天乐(1)

Tensorflow.jpg 首先祝大家新年快乐!在此遥祝大家在 2020 年里身体健康、万事如意! 2019 年复盘 年终岁尾大家都在复盘,小时候,就是在前些年我也没有听过复盘这个词,对于我是新词。我也像利用春节小长假,来对今年自己学习进行一次复盘。上半年自己有一些迷茫,学习也是东一块(rust)西一块(golang)没有目标,人到中年自己,在事业上缺少安全感。下半年终于确定了自己目标—机器学习,这是一条艰苦漫长的路途。也曾因为看不清前方曾经试图放弃,也曾一点点进步而欣喜若狂,这些都是旅途的一幅幅画面,都是一次一次经历,学习如此人生如此,我们一定要享受今天过程。 春节期间对于自己学习过进行复盘以达到温故而知新效果,同时把一些含糊概念弄懂弄透。 今年主要做 2 刷,巩固自己学习过知识,在原有...阅读全文

博文 2020-01-25 03:32:49 zidea

Go环境搭建

下载Go,网址如下 (1)https://studygolang.com/ (2)https://golang.google.cn/ (3)https://golang.org/ 那个可以下载就下载那个 下载完成后解压到一个目录,我选择D盘 解压完毕看到c盘有一个go文件夹,里面内容如下 GOROOT环境变量 D:\go 此时运行cmd中输入go path中添加如下环境变量 ;%GOROOT%\bin 重启cmd,输入 go version看到如下信息 但是还没有完成,在D盘下新建goProject文件夹,新建环境变量GOPATH 这样以后的文件都可以放在这个文件夹下了,但是还需要三个文件src、pkg 和 bin分别用于存放源码文件、包文件和可执行文件。这样就可以再SRC下写代码了,例如这...阅读全文

博文 2019-07-16 21:32:41 假装我不帅

Golang中的一些编译逻辑坑

2 ^ 15 == (0010 ^ 1111 = 1101) ^ 为异或,不是幂 2**3 math.Pow(2,3) 编译会报错,不同于python中的阶乘,求阶乘需要用math函数或者自己实现 func A(string string) string { return string + string } func B(len int) int { return len + len } func C(val, default string) string { if val == "" { return default } return val } 以上三个函数中,只有最后一个会编译报错,因为使用了default关键了。string 和 len 是预定义标识符,可以在局部使用。nil 也可以...阅读全文

第一课cgo所需环境

课程目标Window系统下的环境搭建,go的环境配置,MinGW的环境配置Linux系统下的环境搭建,go的环境配置,Linux自带gcc很方便摘要在macOS和Linux下gcc,在window下需要安装MinGW。同时需要保证环境变量CGO_ENABLED被设置为1,这是表示cgo是否被启用状态。在本地构建时CGO_ENABLED默认启用,在交叉构建cgo是默认禁用的。比如交叉构建ARM环境运行GO程序,需要手动设置CGO_ENABLED环境变量。主角登场首先下载go,搭建本地的go开发环境。下载地址https://golang.google.cn/dl/,尽量选择比较新的版本,因为版本不一样,对于cgo的支持程度有一些区别,为了避免出现一些不必要的问题,建议使用最新稳定版本。在下使用的...阅读全文

博文 2019-08-08 15:57:27 qiurankcom