go
talkingmute
这个作者很懒,什么都没留下…
展开
-
go语言reflect反射使用总结
go语言的反射机制,是程序在运行期间可以对程序本身的一些变量或者结构体等信息进行访问和修改,可以让函数接口的类型更加多元化。比如,通过给函数定义interface{}类型的参数,在函数内部利用反射针对不同类型参数进行不同处理。反射的调用是使用reflect包,reflect 包的两种类型 Type 和 Value,这两种类型使访问接口内的数据成为可能,它们对应两个简单的方法,分别是 refle...原创 2019-12-31 10:32:57 · 485 阅读 · 0 评论 -
go语言time包的定时器NewTicker、计时器NewTimer,等待时间函数AfterFunc使用
go语言time包里有各种跟时间有关的结构和函数,定时器NewTicker是设定每隔多长时间触发的,是连续触发,而计时器NewTimer是等待多长时间触发的,只触发一次,两者是不同的。等待时间函数AfterFunc是在After基础上加了一个回调函数,是等待时间到来后在另外一个goroutine协程里调用。下面使用例子:// test.gopackage mainimport (...原创 2019-12-26 09:38:46 · 2841 阅读 · 0 评论 -
go语言基于time.After通道超时设计和通道关闭close
go语言中多个并发程序的数据同步是采用通道来传输,比如v:=<-chan,从通道里读取数据到v,是一个阻塞操作。可是如通道里没有数据写入,就是chan<-data,这样写入通道的操作,在读操作时就会一直阻塞,需要加入一个超时机制来进行判断。具体的超时设计是通过使用select和case语句,类似于switch和case,在每一个case里进行一个io操作,比如读或者写,在最后一个c...原创 2019-12-25 21:37:39 · 1091 阅读 · 1 评论 -
go语言小型书本管理系统框架
对于一般的管理系统,分为数据层,控制层,应用层三个模块。数据层就是底层数据结构定义和封装,控制层就是对底层数据封装后提供的一些控制操作,应用层就是上层用户的处理。举例来说:下面是一个书本对象结构体,就是最底层的数据结构,封装了新建和获取两个接口。package bookdataimport ( "fmt")type Book struct {//定义一个书本结构体对象 ...原创 2019-12-24 20:47:17 · 404 阅读 · 0 评论 -
go语言sync包里RWMutex读写锁的使用
go语言里读写锁RWMutex是一个可以进行写和读操作分别加锁的对象,相对Mutex来说效率更高些。写操作用Lock加锁和Unlock解锁,读操作用Rlock加锁和RUnlock解锁。当用读操作加锁时,其他读操作也可以继续锁定,互不影响。而写操作一旦有一个加锁时,其他的写操作就不能再锁定,读操作也不能锁定,必须要等待写操作解锁后才能进行。当然了,如有读操作锁定后,写操作锁定必须要等它解锁后才能...原创 2019-12-24 14:36:27 · 484 阅读 · 0 评论 -
go语言接口断言的使用
go语言里接口断言和类型断言一样,是用于判断某个对象是否有接口的所有方法。格式如:返回值,bool变量:=要判断的具体对象.(具体接口),当该对象具有我们要判断的接口方法时,就会返回true,通过返回值就能调用特定的方法。使用范例如下:// testpackage mainimport ( "fmt")type Flyer interface { Fly()}type...原创 2019-12-23 17:56:07 · 827 阅读 · 0 评论 -
go语言sort排序包的使用
对于排序,go语言的sort包里提供有丰富的接口,内置有3个类型的排序接口,sort.Float64s,sort.Ints,sort.Strings分别对应的浮点数,整数,字符串切片的排序。还有一个Slice函数,定义如下:func Slice(slice interface{}, less func(i, j int) bool),只需传入一个要排序的切片,一个回调函数即可。使用范例如下:...原创 2019-12-23 13:10:08 · 779 阅读 · 0 评论 -
go语言interface{}类型断言的举例使用
在go语言里经常会用到interface{}类型,它是类似于c语言中的void *类型,可以接受任意类型的参数。当我们的函数或者方法中有该参数时,要判断具体的类型值再进行相应处理。一般格式:返回值,bool变量:=interface{}变量.(要判断的具体类型),这样就是以某个具体类型来断言,返回值就是这个具体类型的。比如:v,b:=a.(string),这个就是假设a这个interface{...原创 2019-12-21 22:09:57 · 1333 阅读 · 0 评论 -
go语言使用json序列化
在网络数据传输,经常需要把要发送和接收的结构体信息序列化成特定的格式传输,json是其中比较常用和简洁的一种协议。在go语言中encoding/json包里有对应的api接口可以支持,具体使用参见下面例子:package mainimport ( "fmt" "encoding/json")//注意:需要序列化的每个结构体中成员,首字母必须要大写,否则序列化后的数据是空!...原创 2019-12-20 10:11:03 · 315 阅读 · 0 评论 -
go语言使用内嵌结构体达到c++派生继承的效果
go语言里没有类的概念,不过有结构体这样的语法,也可以当做类来使用,并在结构体中定义方法,最终达到c++语言中派生和继承的效果。具体是在结构体里内嵌其他结构体,当做从基类派生一样,可以继承使用基类的方法。比如:type Books struct {//定义一个基类结构体Books title string id int}func (bk Books) m_Get () (...原创 2019-12-19 15:44:17 · 438 阅读 · 0 评论 -
go语言事件响应系统简述
事件响应系统是一个提供了事件注册,事件调用与一体的系统,能让上层应用和底层业务实现解耦,实现分层部署。上层应用通过注册自己感兴趣的事件(一般传递事件名字),在适时的使用调用事件函数获取返回的信息。而底层实现就是事件注册系统,则提供了如何注册事件响应函数,如何调用的实现细节。package mainimport "fmt"//创建一个事件响应map映射,事件名-事件函数切片//每个事...原创 2019-12-19 10:21:32 · 316 阅读 · 0 评论 -
go语言可变参数和interface{}使用
go语言也支持可变参数,使用形式:func 函数名(参数名...类型) 返回值 {},跟正常其他函数声明不同的是,在参数名和类型中间加了...符号。当需要传递的是不定类型和任意类型时,可以用interface{}代替,类似于c语言中的void *下面这个例子演示了可变参数的使用,传递的是interface{}任意类型,并通过switch case语句,对可变参数里的每一个元素使用.(type)...原创 2019-12-18 11:02:23 · 4152 阅读 · 0 评论 -
go语言闭包
闭包其实也就是匿名函数的一种。是函数的嵌套使用,内层的函数可以使用外层函数的所有变量,即使外层函数已经执行完毕。内层函数可以对外部捕获的变量进行访问和修改,类似于c++中static静态局部变量的作用。package mainimport ( "fmt")func addf(value int) func(value2 int) int { // 返回一个闭包 t...原创 2019-12-17 23:03:59 · 118 阅读 · 0 评论 -
go语言strings字符串使用详解和io输入
关于go语言字符串的使用,通过strings包是最方便的,里面提供有多种方法,可以快速地判断字符串位置,前缀和后缀,替换某个字符或删除等。下面这个例子,通过标准键盘输入,接收一个字符串,然后进行各种字符串操作示范。package mainimport ( "bufio" "fmt" "os" "strings")func prints(s string...原创 2019-12-17 10:26:25 · 1149 阅读 · 0 评论 -
go语言里双向链表使用
go语言里也提供有链表结构,在contain/list包里,是一个有头部和尾部指针的双向链表。在链表内部有一个关键的element结构,这个结构记录着元素的值,和一些关系等信息,在插入和删除时需要这个结构指针。具体使用看如下例子,关于链表插入、删除、遍历的方法:package mainimport ( "fmt" "container/list")//双链表里有一个*lis...原创 2019-12-16 20:40:09 · 244 阅读 · 0 评论 -
go语言中new和make区别
new 和 make 是go语言的两个内置函数,都是用来创建并分配内存,new函数只接受一个参数,这个参数是一个类型,并且返回一个指向该类型内存地址的指针。而make只能用于 slice、map 和 channel 的初始化,它返回的类型就是这三个类型本身,因为这3个本身就是引用类型,就不需要再返回指针了。如下所示,使用new的例子: ii:=3 var in =new(in...原创 2019-12-16 18:49:39 · 252 阅读 · 0 评论 -
go语言遍历map和按序输出
map是一种无序的key-value数据结构,使用for-range语句就可以遍历。当需要按序打印输出,可以把map中的对应数据拷贝到切片里,使用sort包里的排序函数进行排序。sort.Ints:对整数进行排序,sort.Strings:对字符串进行排序,sort.Float64s:对浮点数进行排序。package mainimport ( "fmt" "sort")f...原创 2019-12-16 16:42:14 · 3568 阅读 · 0 评论 -
go语言中切片使用详解:添加,删除,复制
go语言里切片是一个动态数组,在创建时候长度不固定,后期随着使用会动态变化,通过一个append方法就能实现添加和删除的功能,复制是通过copy,用于两个切片之间的内存拷贝,要注意和直接赋值=的区别。而数组是长度固定的,无法在后续使用进行灵活变化。有关他们的使用区别,看下面代码就足够了,有详细注释:package mainimport ( "fmt")func pr...原创 2019-12-16 10:14:40 · 692 阅读 · 0 评论 -
go语言字符串和其他类型的转换
go语言里字符串和其他类型的转换,大多使用strconv包里的一些函数,如FormatInt是把一个int类型格式化成string,ParseInt是把一个string解析成int。对应的FormatFloat,ParseFloat是针对浮点数和string之间的转换。如下所示: var num int = 100 str := strconv.FormatInt(int64(n...原创 2019-12-14 21:44:23 · 312 阅读 · 0 评论 -
go语言的变量逃逸分析
在 C语言中,需要开发者自己学习如何进行内存分配,选用怎样的内存分配方式来适应不同的算法需求。而Go语言将这个过程整合到了编译器中,命名为“变量逃逸分析”。通过编译器分析代码的特征和代码的生命周期,决定应该使用堆还是栈来进行内存分配。package mainimport ( "fmt")type Data struct { name string id int}va...原创 2019-12-14 18:24:06 · 389 阅读 · 0 评论 -
go语言base64编码使用
在网络中经常会遇到base64编码的情况,需要进行编码和解码的过程。例子代码如下:package mainimport ( "encoding/base64" "fmt")func main() { // 需要处理的字符串 olddata := "haha baby i love you ,886" // 编码消息 encode...原创 2019-12-14 14:02:26 · 337 阅读 · 0 评论 -
go语言string和[]byte的转换
Go 语言的字符串是不可变的。修改字符串时,可以将字符串转换为 []byte 进行修改,比如:string->[]byte:[]byte(str)当需要把[]byte 转换为string 时,可以通过强制类型转换互转,比如:string(byte)str := "你好zssss never go"aBytes := []byte(str)aBytes[0] = '0'aByt...原创 2019-12-14 13:41:34 · 561 阅读 · 0 评论 -
go语言遍历字符串
当字符串中字母,汉字都有时,使用range遍历是最适合的。sr:="haha--你好123" for i,s:= range sr { fmt.Printf("第%d个:%c\n",i,s) }因为每个中文占用 3 个字节,所以到中文时索引+3...原创 2019-12-13 20:42:05 · 354 阅读 · 0 评论 -
go语言线程并发之sync.WaitGroup同步和sync.Mutex互斥
期初接触go语言中线程并发同步,大多使用通道channel,一个在通道里写,另一个在通道里等待读,但是如线程太多,就要申请很多通道,浪费资源。这时可以借助go语言中的sync库的WaitGroup对象,它里面是有一个计数器,最初从0开始,它有三个方法:Add(), Done(), Wait() 用来控制计数器的数量。Add(n) 把计数器设置为n ,Done() 每次把计数器-1 ,Wait() ...原创 2019-12-13 16:32:17 · 909 阅读 · 0 评论 -
go语言并发goroutine和channel
goroutine 是 go语言里的轻量级线程,仅仅利用 go 就能立刻起一个新线程。多线程之间的同步问题,在 go语言中可以使用 channel 作为同步的工具。通过 channel 通道可以实现两个 goroutine 之间的通信。创建通道的方法使用make函数,如:make(chan 类型,num),这里的第二个参数就是要创建的通道数目,写入通道用:通道名字<-要写入的数值,从通道读...原创 2019-12-12 20:32:44 · 186 阅读 · 0 评论 -
go语言之错误异常详细示范(defer,recover的使用)
在go语言中,很多函数都提供有错误消息返回,比如常见的os库里的文件操作,当打开,读取等操作时都会触发错误。这些函数会返回多个值,其中就包括错误信息。还有一个,当判断map类型中某个key是否存在时,也可以用到多返回值。比如: stud:=make(map[int]string) stud[2]="haha" //插入key-value stud[5]="jack"...原创 2019-12-12 12:06:22 · 2223 阅读 · 0 评论 -
go语言错误处理之error
go语言里有一个内置错误对象,就是error,它里面有一个Error()方法,每次是返回一个错误信息。package mainimport ( "fmt" "strings" //字符串相关库)//定义了一个接口Person,里面有getName,setName两个方法type Person interface { getName() string ...原创 2019-12-12 11:33:11 · 534 阅读 · 0 评论 -
go语言中interface接口的使用(效果同c++虚函数多态)
go语言中interface接口,它把所有的具有共性的方法定义在一起,然后给其他类型重写调用。跟c++虚函数多态一样,相当于刚开始是定义了一个基类,提供了很多公有函数,具体实现是要在派生类里自己重写,以便在运行时根据所指向的对象,调用对应的函数接口。package mainimport "fmt"//定义了一个接口Person,里面有getName,setName两个方法type P...原创 2019-12-11 23:34:35 · 1020 阅读 · 0 评论 -
go语言中map类型的使用
map类型是跟其他语言一样,也是key-value对。可以用make函数来初始化,var map=make(map[key类型]value类型)package mainimport "fmt"func main() { //range也可以用在map的键值对上。 kvs := map[string]string{"姓名": "apple", "地址": "beijing"}...原创 2019-12-11 20:30:15 · 279 阅读 · 0 评论 -
go语言切片和数组
go语言的切片是动态数组,长度不固定。跟一般的数组不一样。package mainimport "fmt"func main() {//Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的 var numbers = make([]int,3,5) //make([]T, length, capacity)创建一个切片,capacity会...原创 2019-12-11 17:45:58 · 248 阅读 · 1 评论 -
go语言指针数组和数组指针详解
go语言跟c语言一样,指针数组和数组指针概念容易搞混,其实只要看后面的两字就行。指针数组就是一个数组,数组里每一个元素是一个指针。数组指针呢,则是一个指针,它是指向一个数组的地址。package mainimport "fmt"const MAX =3func main() { a:=[MAX]int{3,33,12} var ptra *[MAX]int=...原创 2019-12-11 15:42:54 · 1097 阅读 · 0 评论 -
go语言结构体使用总结
在go语言中,如要把结构体传入函数或者方法,有两种情况:1-如只是读取结构体里成员,不牵涉修改,可以作为参数的值传递:变量名 结构体类型2-如要修改结构体里成员,就要用结构体指针传入:变量名 *结构体类型package mainimport "fmt"type Books struct { title string id int}func Set (bk *Bo...原创 2019-12-11 12:30:00 · 400 阅读 · 0 评论 -
go语言指针变量做函数参数
packagemainimport"fmt"funcmain(){ /* 定义局部变量 */ varaint=100 varbint=200 fmt.Printf("交换前 a 的值 : %d\n",a) fmt.Printf("交换前 b 的值 : %d\n",b) /* 调用函数用于交换值 * &a 指向 a ...原创 2019-12-11 11:38:58 · 214 阅读 · 0 评论 -
go语言学习基础语法
下面是一段go语言基础语法学习代码,整理的:package main //每个go程序的入口,必须有main//import的每个目录下只能有一个package包//同一个文件夹下的文件只能有一个包名,否则编译报错。import ("fmt""./my" //这里是导入当前目录下my目录下的包./表示当前路径。"../cdiv" //这里是用..表示上级目录下的cdiv)co...原创 2019-12-11 11:00:18 · 141 阅读 · 0 评论