go语言之行--结构体(struct)详解、链表

go语言中没有像类的概念,但是可以通过结构体struct实现oop(面向对象编程)。struct的成员(也叫属性或字段)可以是任何类型,如普通类型、复合类型、函数、map、interface、struct等,所以我们可以理解为go语言中的“类”。struct定义在定义struct成员时候区分大小写,若首字母大写则该成员为公有成员(对外可见),否则是私有成员(对外不可见)。typestruct_variable_typestruct{membermember_typemembermember_type.....membermember_type}//示例typeStudentstruct{namestringageintClassstring}声明与初始化varstu1Studentvarstu2*Student=&Student{}//简写stu2:=&Student{}varstu3*Student=new(Student)//简写stu3:=new(Student)struct使用在struct中,无论使用的是指针的方式声明还是普通方式,访问...

go语言之行--数组、切片、map

append:追加元素到slice里,返回修改后的sliceclose:关闭channeldelete:从map中删除key对应的valuepanic :用于异常处理,停止常规的goroutinerecover:用于异常处理,允许程序定义goroutine的panic动作imag:返回复数(complex)的实部real :返回复数(complex)的虚部make:用来分配内存,主要分配引用类型,返回Type本身(只能应用于slice,map,channel)new:分配内存,主要分配值类型,返回指向Type的指针,如intcap :容量,容积capacitycopy:复制slice,返回复制的数目len:返回长度概念:同一组数据类型的固定长度的序列注意:长度数数组类型的一部分,因此vara[2]int和 vara[3]int是不同的类型数组索引是从0开始(python相同),访问超过了索引会panic数组定义完成之后,每个位置会有默认值,int类型,默认值为0,string类型默认为空字符串数组属于值类型,当对其进行拷贝并修改副本值时,并不会改...

go语言之行--基础部分

布尔型布尔类型 -由两个预定义常量组成:true、false,默认值为falsepackagemainimport"fmt"funcmain(){var(abool//默认值为falsebbool=true)fmt.Println(a,b)}数字类型整型:uint8(无符号8位整型(0到255))uint16(无符号16位整型(0到65535))uint32(无符号32位整型(0到4294967295))uint64(无符号64位整型(0到18446744073709551615))int8(带符号8位整型(-128到127))int16(带符号16位整型(-32768到32767))int32(带符号32位整型(-2147483648到2147483647))int64(带符号64位整型(-9223372036854775808到9223372036854775807))浮点型:float32(IEEE-75432位浮点型数)float64(IEEE-75464位浮点型数)complex64(复数:32位实数和虚数)complex128(复数:64位实数和虚数)其他数字类...

go语言之行--包与变量

一、包的概念包是go语言中不可缺少部分,在每个go源码的第一行进行定义,定义方式是:package"包名",并且该名称是作为调用该包时候所使用的名称。包的概念总结:每个Go文件都属于且仅属于一个包。一个包可以由许多以 .go 为扩展名的源文件组成,因此文件名和包名可能不同,为了规范,功能相似或者属于相同性质的源码归集到相同的包名中。每个应用程序都必须有且只有一个包名称为main,他是该程序的入口,执行时候会寻找包名为main的代码包与包之间可以被相互调用,主要为了减少代码重复性包一旦被引入就需要被使用,除非引入的时候忽略它(前面加_表示忽略它,只是用它来初始化),如果引入了包,而在代码中没用使用,运行时候会报错 二、包的引入1.包引入的方法方法一:import"fmt"import"os"方法二:import"fmt";import"os"方法三(推荐!)import("fmt""os") 2.引入其他包go语言中,引入包的路径是根据GOPATH/src这个环境变量作为相对路径进行引入的,如果GOPATH存在多个,那么go将逐一寻找路径,直到找到...

go语言之行--简介与环境搭建

一、Go简介Go是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。Go是从2007年末由RobertGriesemer,RobPike,KenThompson主持开发,后来还加入了IanLanceTaylor,RussCox等人,并最终于2009年11月开源,在2012年早些时候发布了Go1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。Go语言最主要的特性:自动垃圾回收更丰富的内置类型函数多返回值错误处理匿名函数和闭包类型和接口并发编程反射语言交互性易于部署再说说我学习go的原因:1.性能优越:这是个总所周知的特点,天生具备高并发性。2.部署方便:一开始我只是想尝尝鲜,然后写了一点点代码,然后发现编译非常简单,同时部署时候就是二进制包(linux)或exe文件(windows),这对于做运维的人来说太方便了。3.最近在学习kuberneters,其实现也是go语言,所以让我下定了学习go的决心。二、GO与Python作为python程序员,我对python当然也在熟悉不过了,总所周知由于GIL所问题导致速度较慢,当然go弥补了这个缺点,由于初学go还不...

go语言字节序 encoding/binary

 字节序就是多字节数据类型(int,float等)在内存中的存储顺序。在网络传输中基于文本类型的协议(比如JSON)和二进制协议都是字节通信,是采用字节序进行数据包的处理。字节序可分为大端序,低地址端存放高位字节;小端序与之相反,低地址端存放低位字节。在计算机内部,小端序被广泛应用于现代性CPU内部存储数据;而在其他场景譬如网络传输和文件存储使用大端序。在网络协议层操作二进制数字时约定使用大端序,大端序是网络字节传输采用的方式。因为大端序最高有效字节排在首位(低地址端存放高位字节),能够按照字典排序,所以我们能够比较二进制编码后数字的每个字节。 Go中有多种类型的整型,int8,int16,int32和int64,分别使用1,3,4,8个字节表示,我们称之为固定长度类型(fixed-lengthtypes)。Go处理固定长度字节序Go中处理大小端序的代码位于encoding/binary,包中的全局变量BigEndian用于操作大端序数据,LittleEndian用于操作小端序数据,这两个变量所对应的数据类型都实行了ByteOrder接口:typeByteOrder...

go语言 nil一些注意的地方

 nilnil是go语言中预先定义的标识符,不是关键字或保留字。我们可以直接使用nil,而不用声明它。而且我们可以定义一个名称为nil的变量,比如下面这样:varnil=errors.New("mygod")虽然上面的声明语句可以通过编译,但是并不提倡这么做。 默认值nil在go语言中,布尔类型的零值(初始值)为false,数值类型的零值为0,字符串类型的零值为空字符串""。除此之外其它类型的默认值为nil,nil可以代表下面这些类型的零值:指针类型(包括unsafe中的)map类型slice类型function类型channel类型interface类型nil没有默认类型预先定义的nil是唯一的一个go语言中没有默认类型的非类型值。对于编译器来说,必须从上下文中获取充足的信息才能推断出nil的类型。当你把nil赋值给一个channel类型变量,此时为channel类型。当你把nil赋值给map类型变量,此时为map类型。不同类型的nil值占用的内存大小可能是不一样的一个类型的所有的值的内存布局都是一样的。nil也不例外。nil的大小一致与同类型中的非nil类型的值...

go语言常用内置函数

 closefuncclose(cchan<-Type)close用于关闭一个channel,使用close函数要注意以下几点:关闭一个只接受的channel会导致错误在一个已经关闭的channel上发送数据会导致panic关闭一个nilchannel会导致panic在一个channel关闭之后,如果channel已经没有剩余数据等待接受了,这时候如果继续接收,会返回一个channel对应数据类型的nilvalue,如果接收的时候使用多返回值,第二个参数表示一个channel是否已经关闭。 len、caplen:获取容器已存储的元素个数,不是容器的容量。funclen(vType)intcap:获取容器的最大存储元素的容量。funccap(vType)intlen和cap都接收多种类型的参数,返回值是int类型,具体接收哪些类型的参数以及返回的值的含义见下表len,cap的返回值满足如下条件:0<=len(s)<=cap(s)slice,map,channel的nil值的len为0slice,channel的nil值的cap为0 appe...

Go语言(container学习)

本文来自:CSDN博客感谢作者:ACHelloWorld查看原文:Go语言(container介绍)container:容器|container可以看出包含三部分:heap,list和ring。下面分别介绍1.heap  heap即为堆,是一种常用的数据结构,在源码里面,提供了接口,在实际使用时需要实现。  下面是一个关于heap使用的实例。   代码:packagemainimport("fmt""container/heap")//heap提供了接口,需要自己实现如下方法typeHeap[]int//构造的是小顶堆,大顶堆只需要改一下下面的符号func(h*Heap)Less(i,jint)bool{return(*h)[i]<(*h)[j]}func(h*Heap)Swap(i,jint){(*h)[i],(*h)[j]=(*h)[j],(*h)[i]}func(h*Heap)Len()int{returnlen(*h)}func(h*Heap)Pop()interface{}{x:=(*h)[h.Len...
代码星球 代码星球·2020-05-11

go语言的time包(转载)

作者:waynehu地址:go语言的time包go语言的time包##组成time.Duration(时长,耗时)time.Time(时间点)time.C(放时间点的管道)[Time.C:=make(chantime.Time)]time包里有2个东西,一个是时间点,另一个是时长时间点的意思就是“某一刻”,比如2000年1月1日1点1分1秒那一刻(后台记录的是unix时间,从1970年开始计算)时长就是某一刻与另一刻的差,也就是耗时Sleep函数time.Sleep(time.Duration)表示睡多少时间,睡觉时,是阻塞状态fmt.Println("startsleeping...")time.Sleep(time.Second)fmt.Println("endsleep.")//【结果】打印startsleeping后,等了正好1秒后,打印了endsleep//会阻塞,Sleep时,什么事情都不会做After函数time.After(time.Duration)和Sleep差不多,意思是多少时间之后,但在取出管道内容前不阻塞fmt.Println("the...
代码星球 代码星球·2020-05-11

go语言单元测试和基准测试

Go语言中测试依赖gotest命令。gotest命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内,所有以_test.go为后缀名的源代码文件都是gotest测试的一部分,不会被gobuild编译到最终的可执行文件中。 测试函数类型在*_test.go文件中有三种类型的函数:单元测试函数,基准测试函数和示例函数。类型 格式   作用测试函数函数名缀为Test测试程序的一些逻辑行为是否正确基准函数函数名前缀为Benchmark测试函数的内存占用和运行效率的性能数据示例函数函数名前缀为Example为文档提高示例文档测试规则测试规则主要为文件命名与放置规则:测试源文件名应是_test结尾的go文件,例如:add_test.go;测试代码和业务代码是分开的,但两者应该位于同一包下;测试源文件所在的包应该位于$GOPATH/src目录下;测试文件必须导入"testing"包; 测试函数每个测试函数必须导入testing包,测试函数的基本格式如下:funcTestName(t*testing.T){//...}测试函数的名字必...

Go语言中type的用法

Go语言中type的用法:1.定义结构体类型2.类型别名3.定义接口类型4.定义函数类型 1.定义结构体类型结构体可用于用户自定义数据类型和进行面向对象编程。typePersonstruct{namestringageintsexbool}func(p*Person)Eat(){fmt.Printf("%s爱吃西红柿炒鸡蛋",p.name)}func(p*Person)Drink(){fmt.Printf("%s爱喝可乐",p.name)}func(p*Person)Sleep(){fmt.Printf("%s要睡8个小时",p.name)}func(p*Person)Love(){fmt.Printf("%s喜欢",p.name)}  2.类型别名typestrstringstr类型与string类型等价例子:packagemainimport"fmt"typestrstringfuncmain(){varmynamestr="Ling"fmt.Printf("%s",myname)}3.定义接口typeShaperinterface{Area()float64}接口定义了...
代码星球 代码星球·2020-05-10

消息队列rabbitmq的五种工作模式(go语言版本)

前言:如果你对rabbitmq基本概念都不懂,可以移步此篇博文查阅消息队列RabbitMQ一、单发单收二、工作队列WorkQueue三、发布/订阅Publish/Subscribe四、路由Routing五、Topic类型的exchange六、rabbitmq部分封装代码及装备工作 在下图中,“P”是我们的生产者,“C”是我们的消费者。中间的框是一个队列-RabbitMQ代表使用者保留的消息缓冲区。单发单收模式下:一发一收发送端只需要创建队列,然后向队列发送消息。接收端也需要创建队列,因为如果接收端先启动,没有此队列就会报错,虽然发送端和接收端都创建此队列,但rabbitmq还是很智能的,它只会创建一次。需要注意的地方:1.发送端和接收端都需要创建同名队列2.接收端指定从这个同名队列中接收消息发送端packagemainimport("RabbitMQ""strconv""strings""time")funcmain(){//第一个参数指定rabbitmq服务器的链接,第二个参数指定创建队列的名字send_mq:=rabbitM...

go语言实现限流器

本文:https://chai2010.cn/advanced-go-programming-book/ch5-web/ch5-06-ratelimit.html计算机程序可依据其瓶颈分为磁盘IO瓶颈型,CPU计算瓶颈型,网络带宽瓶颈型,分布式场景下有时候也会外部系统而导致自身瓶颈。Web系统打交道最多的是网络,无论是接收,解析用户请求,访问存储,还是把响应数据返回给用户,都是要走网络的。在没有epoll/kqueue之类的系统提供的IO多路复用接口之前,多个核心的现代计算机最头痛的是C10k问题,C10k问题会导致计算机没有办法充分利用CPU来处理更多的用户连接,进而没有办法通过优化程序提升CPU利用率来处理更多的请求。自从Linux实现了epoll,FreeBSD实现了kqueue,这个问题基本解决了,我们可以借助内核提供的API轻松解决当年的C10k问题,也就是说如今如果你的程序主要是和网络打交道,那么瓶颈一定在用户程序而不在操作系统内核。随着时代的发展,编程语言对这些系统调用又进一步进行了封装,如今做应用层开发,几乎不会在程序中看到epoll之类的字眼,大多数时候我们就只要聚焦...
代码星球 代码星球·2020-05-09

go语言实现分布式锁

本文:https://chai2010.cn/advanced-go-programming-book/ch6-cloud/ch6-02-lock.html在单机程序并发或并行修改全局变量时,需要对修改行为加锁以创造临界区。为什么需要加锁呢?我们看看在不加锁的情况下并发计数会发生什么情况:packagemainimport("sync")//全局变量varcounterintfuncmain(){varwgsync.WaitGroupfori:=0;i<1000;i++{wg.Add(1)gofunc(){deferwg.Done()counter++}()}wg.Wait()println(counter)}多次运行会得到不同的结果:❯❯❯gorunlocal_lock.go945❯❯❯gorunlocal_lock.go937❯❯❯gorunlocal_lock.go959  想要得到正确的结果的话,要把对计数器(counter)的操作代码部分加上锁://...省略之前部分varwgsync.WaitGroupvarlsync.Mutexfori:=0;i<1000;i...
代码星球 代码星球·2020-05-09
首页上一页...56789...下一页尾页