随笔分类 -  Go语言学习笔记

摘要:一、为什么要包管理 默认Go的第三方包都是放在Gopath的src目录下,而且这些包都没有版本号的概念,这样的可能会出现一些问题。 举个例子:当A同事将开发完程序之后,此时可能引用了一个第三方的包,过了不久之后,B同事接手了该项目,此时如果B同事通过go get 命令获取了包,而且包的版本进行了升级 阅读全文
posted @ 2019-08-29 10:57 奋斗的大橙子 阅读(1225) 评论(0) 推荐(1) 编辑
摘要:在分布式的系统中,因为涉及到数据的传输,所以一定会进行数据的交换,此时就要定义数据交换的格式,例如二进制、Json、Xml等等。本篇文章就是总结一下常用的几种数据格式。 一、Json格式 如果想使用Json数据格式,可以借助于encoding/json这个包。 利用json包里的 json.Mars 阅读全文
posted @ 2019-08-12 19:50 奋斗的大橙子 阅读(2016) 评论(0) 推荐(0) 编辑
摘要:⼀、使用Golang创建⼀一个TCP连接 1.服务端处理理流程 a.监听端口 b.接受客户端的链接 c.创建Goroutine,处理这个链接(⼀个服务端要链接多个客户端,所以使用Goroutine⾮常简单) 题外话:要是用Java、C#服务这边每⼀个请求都开⼀个线程处理的话,顶多⼏千个,但是Goro 阅读全文
posted @ 2019-07-23 23:34 奋斗的大橙子 阅读(6371) 评论(1) 推荐(1) 编辑
摘要:一、 通过runtime包进行多核设置 1.NumCPU()获取当前系统的cpu核数 2.GOMAXPROCS设置当前程序运行时占用的cpu核数 版本1.6之前默认是使用1个核,而之后是全部使用。 好玩的程序: 我的电脑是8核的,分别运行1 2 4 8,看下cpu的使用率: 图一 未开始运行 图二 阅读全文
posted @ 2019-07-22 13:26 奋斗的大橙子 阅读(658) 评论(0) 推荐(0) 编辑
摘要:一、格式化输入和输出 1.从终端获取用户的输入 fmt.Scanf 空格作为分隔符,占位符和格式化输出的一致 fmt.Scan 从终端获取用户的输入,存储在Scanln中的参数里,空格和换行符作为分隔符 fmt.Scanln 从终端获取用户的输入,存储在Scanln中的参数里,空格作为分隔符,换行符 阅读全文
posted @ 2019-07-19 12:57 奋斗的大橙子 阅读(2172) 评论(0) 推荐(0) 编辑
摘要:反射是语言里面是非常重要的一个特性,我们经常会看见这个词,但是对于反射没有一个很好的理解,主要是因为对于反射的使用场景不太熟悉。 一、理解变量的内在机制 1.类型信息,元信息,是预先定义好的,静态的。 2.值信息,程序进行过程中,动态变化的。 二、反射和空接口 1.空接口相当于一个容器,能接受任何东 阅读全文
posted @ 2019-07-17 09:53 奋斗的大橙子 阅读(9834) 评论(0) 推荐(0) 编辑
摘要:可以用作一些资源的释放。 1.在一个函数内的defer执行顺序是先写的后执行,后写的先执行(遵循栈结构) 结果: 2.defer 执行语句的值和定义defer语句函数的关系 执行结果 3.defer的原理 首先看下defer和return语句的区别,如下 可以看到 return 执行的时候 将结果x 阅读全文
posted @ 2019-06-28 13:42 奋斗的大橙子 阅读(469) 评论(0) 推荐(0) 编辑
摘要:在C#或者Java里面我们都知道,一个Class是要包含成员变量和方法的,对于GO语言的Struct也一样,我们也可以给Struct定义一系列方法。 一、怎么定义一个方法? Go的方法是在函数前面加上一个接收者,这样编译器就知道这个方法属于哪个类型了。例如: 上面的代码就是定义了一个Student的 阅读全文
posted @ 2019-04-28 10:45 奋斗的大橙子 阅读(3229) 评论(0) 推荐(0) 编辑
摘要:一、Go语言中没有像C#、Java一样的Class,只有Struct这样的结构体。Go语言使用type关键字来定义一个类型。 如下: 二、Struct的声明以及初始化 初始化方法一:直接定义,通过变量名.成员名的方式赋值 初始化方法二:直接通过{}进行初始化,这点和C#不一样,C#初始化的时候一般用 阅读全文
posted @ 2019-04-25 20:56 奋斗的大橙子 阅读(1133) 评论(0) 推荐(0) 编辑
摘要:问题一、Go使用Package组织源码的好处是什么? 1.任何源码属于一个包 2.用包组织便于代码的易读和复用 问题二、Go语言中Package的种类 Go语言中存在两种包、一种是可执行程序的包、一种是类库函数的包。 可执行程序的包,编译完成后会生成一个可执行文件、静态库的包编译之后会生成一个.a为 阅读全文
posted @ 2019-04-24 16:45 奋斗的大橙子 阅读(2506) 评论(0) 推荐(0) 编辑
摘要:相同点: make和new都是用来创建分配类型内存的。 不同点: 先看下面的代码 编译过程会出错 我们的想法是把 10 赋值 i指向的地址,但是这里由于 *i 没有初始化,所以并不知道 *i的地址是什么,如果直接 *i的赋值为10,那么肯定是不行的(10这个地址没有) 所以要想使用 *i,需要把 x 阅读全文
posted @ 2019-03-22 16:11 奋斗的大橙子 阅读(460) 评论(0) 推荐(0) 编辑
摘要:1.切片是基于数组做的一层封装,灵活能够自动扩容。 2.切片的初始化方法 ①直接创建 ②基于已有的数组或切片 ③使用make来创建一个切片 第一个5是切片的大小 第二个5是切片的容量 3.基本操作 ①获取元素 ②增加元素append 当达到底层的最大容量,切片会进行扩容,扩容的策略是翻倍扩容。 下图 阅读全文
posted @ 2019-03-22 15:08 奋斗的大橙子 阅读(311) 评论(0) 推荐(0) 编辑
摘要:数组是一个值类型 结果: 从上面结果可以看到,只用B的第二元素被修正了,这里说明A和B直接的拷贝是值拷贝,如果想要都修正,需要传地址,修改上面的赋值语句,为如下 所以在利用数组进行传参的时候,要注意一点传递的是数组的副本,并非本身,如果有需要修正数组内的值并影响原来的数组,就必须要传地址。 阅读全文
posted @ 2019-03-11 13:44 奋斗的大橙子 阅读(366) 评论(0) 推荐(0) 编辑
摘要:一、函数的变量作用域和可见性 1.全局变量在main函数执行之前初始化,全局可见 2.局部变量在函数内部或者if、for等语句块有效,使用之后外部不可见 3.全局变量和局部变量同名的情况下,局部变量生效。 4.可见性: 包内任何变量或函数都是能访问的。 包外的话,首字母大写是可以访问的,首字母小写的 阅读全文
posted @ 2019-03-08 21:21 奋斗的大橙子 阅读(1176) 评论(0) 推荐(0) 编辑
摘要:Go语言和其他语言不一样,它只有一种循环方式,就是for语句 可以参考如下公式: 执行顺序 a.执行一次initialisation,初始化 b.判断condition c.条件为true,执行{}内的语句 d.语句执行之后执行post 使用方式举例: 1.基本使用类似其他语言的for 2.替代wh 阅读全文
posted @ 2019-02-27 13:08 奋斗的大橙子 阅读(4649) 评论(0) 推荐(0) 编辑
摘要:一、基本使用 ①从属于time这个包 ②一般使用都是使用 time.Time 这个类型表示时间 ,time包中还有一些常量,源码如下 ③ time.Now() 获取当前的时间,返回的是Time类型 Time类型中的 Year() 获取当前的年份 Month() 获取当前的月份 Day() 获取当前的 阅读全文
posted @ 2019-02-26 16:54 奋斗的大橙子 阅读(3016) 评论(0) 推荐(0) 编辑
摘要:1.Go语言String的本质就是一个[]byte,所以他们之间可以互相转换,byte数组的长度就是字符串的长度。 结果 2.字符串的值一旦指定,就不能进行修改。如果想修改,则可以先将字符串装换成slice。 会出现如下错误提示 结果 3.rune表示utf8的字符,一个rune字符由一个或多个by 阅读全文
posted @ 2019-02-22 11:12 奋斗的大橙子 阅读(1171) 评论(0) 推荐(0) 编辑
摘要:一、复习常量 提到Iota这个关键字,就必须要复习一下Go语言的常量。 1.Go语言的常量一般使用const声明 2.Go语言的常量只能是布尔型、数字型(整数型、浮点型和复数)和字符串型 3.Go语言的常量可以不指定类型,由编译器自己推断,如下面的【string】就是可以不写的(也称为 隐式类型定义 阅读全文
posted @ 2019-02-21 14:35 奋斗的大橙子 阅读(1960) 评论(0) 推荐(0) 编辑
摘要:有缓冲的通道相比于无缓冲通道,多了一个缓存的功能,如下图描述的一样: 从图上可以明显看到和无缓冲通道的区别,无缓冲必须两个Goroutine都进入通道才能进行数据的交换,这个不用,如果数据有,直接就能拿走。 运行结果: 因为哪一个worker先从通道中取值有系统自己进行调度的,所以每次运行的结果稍微 阅读全文
posted @ 2019-02-15 15:50 奋斗的大橙子 阅读(696) 评论(0) 推荐(0) 编辑
摘要:前言: 上文中我们采用了【原子函数】已经【共享锁】两种方式分别对多个goroutine进行了同步,但是在go语言中提供了另一种更好的方式,那就是使用通道(Channel)。 一、通道是什么? 其实无论是原子函数还是共享锁都是通过共享内存的方式进行的同步、效率一般不高,而Go语言中则使用了通道,它是一 阅读全文
posted @ 2019-02-15 15:25 奋斗的大橙子 阅读(769) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示