我的GO语言学习之路
紫火桑葚
这个作者很懒,什么都没留下…
展开
-
Go 之 快排
基础思维: 以第一个元素为基准, func quickSortPart(vData []int, left, right int) { if left >= right { return } i,j:=left,right key:=vData[left] p:=left for { if i > j { break } for j >= p && vData[j] >= key { j-- } if j >原创 2021-08-28 17:48:17 · 55 阅读 · 0 评论 -
Go 之 冒泡
作为C++开发人员,冒泡算法还是很简单,换个语言,大致还是一样的; 还是啰嗦下逻辑思维: 假设原数据:[2 1 4 3 5 6 0] 以第一个元素为准,找出剩余元素中,比第一个元素小的,交替位置: [0 2 4 3 5 6 1] 以第二个元素为准,找出剩余元素中,比第二个元素小的,交替位置:[0 1 4 3 5 6 2] 以第三个元素为准,找出剩余元素中,比第三个元素小的,交替位置:[0 1 2 4 5 6 3] 以第四个元素为准,找出剩余元素中,比第四个元素小的,交替位置:[0 1 2 3 5 6 4]原创 2021-08-28 14:50:56 · 99 阅读 · 0 评论 -
go 之 浮点数相等判断
因为浮点数不是一种精确的表达方式,所以像整型那样直接用==来判断两个浮点数是否相等 是不可行的,这可能会导致不稳定的结果。 下面是一种推荐的替代方案: import "math" // p为用户自定义的比较精度,比如0.00001 func IsEqual(f1, f2, p float64) bool { return math.Fdim(f1, f2) < p } ...原创 2021-08-23 16:20:53 · 751 阅读 · 0 评论 -
go 之 x.(type)
x.(type)只能在switch中使用 func Test(args ...interface{}){ for _,arg := range args { switch arg.(type) { case int: fmt.Println(arg, "is int") case string: fmt.Println(arg, "is string") case int64: fmt.Println(arg, "is int64") default:原创 2021-04-30 10:45:19 · 299 阅读 · 0 评论 -
go 之 defer
example1 func f() (result int) { defer func() { result++ }() return 0 } example2 func f() (r int) { t := 5 defer func() { t = t + 5 }() return t } example3 func f() (r int) { defer func(r int) {原创 2021-04-28 18:20:16 · 114 阅读 · 0 评论 -
Go 网络编程:Socket编程
传统编程语言的Socket设计流程: 1.创建socket:socekt(); 2.绑定socekt:bind(); 3.监听:listen(); 4.连接:connect(); 5.接受:accept(); 6.接受:receive(); 7.发送:send(); 但Go语言标准对这些复杂的过程进行抽象封装,浓缩成简单的 net.Dial() 调用即可实现; //Dial()原型 func Dial(net, addr string) (Conn, error) //常见协议调.原创 2020-06-05 15:48:03 · 319 阅读 · 0 评论 -
Go 并发编程
基础知识: 1.多进程:操作系统层面进行并发的基本模式; 2.多线程:在大部分操作系统上都属于系统层面的并发模式,也是使用最多的最有效的一种模式,相对来说,比多进程开销小很多,然而开发技术在进步,认为多线程开销依旧比较大,且在高并发模式下,影响效率; 3.基于回调的非阻塞/异步IO:多线程模式在实际高并发服务器开发中,会很快耗尽服务器内存和CPU资源,而基于回调的非阻塞/异步IO模式通过事件驱动的方式使用异步IO,使服务器持续运行,且尽可能少用线程,比较有代表性的就是Node.js,但这种模式的编程比原创 2020-06-04 15:26:27 · 170 阅读 · 0 评论 -
go 类型系统
Go虽然是面向对象编程,但Go没有函数的继承语法,而是支持给任何类型(不包括指针类型)增加新方法的语法,只需要实现该接口要求的所有方法即可。 直接看以下几个代码例子 //例:给内置类型 int 添加Less方法 type Integer int func (a Integer) Less(b Integer) bool { return a < b } func (a *Integer) Add(b Integer) { *a += b } func main(){.原创 2020-05-29 17:24:23 · 161 阅读 · 0 评论 -
go 类型的值语义和引用语义
Go语言重大部分类型都是基于值语义,包括: 1.基本类型:byte,int,bool,float32,float64,string等; 2.复合类型:数组array,结构体struct,指针pointer等; 重点来了,C/C++中,数组传递是引用语义,但在Go中,数组和基本类型没啥区别,都是值语义,也就是说,Go中的数组传递是完全值传递; 不理解?看例子! //C或C++中 int aData[3] = {1,2,3}; auto p = aData; //实际上这里相当于 int*.原创 2020-05-29 15:32:34 · 451 阅读 · 0 评论 -
go defer
go语言的defer函数,很强大,可以说defer绝大多数情况下扮演的是清道夫或者擦屁股的角色; defer 是定义一种行为,当程序执行范围脱离与当前defer的作用域时,会按照该作用域内“后定义先执行”的顺序调用defer。 有点类似C++中,我们经常定义某些自动操作类,在跳出该操作类对象作用域时,会执行到析构函数,从而达到清理资源的作用。 func CopyFile(dst, src ...原创 2020-04-28 10:02:13 · 112 阅读 · 0 评论 -
go函数
1.以下代码可以直观看出函数的关键字 func,入参,多返回值 func Add(a int, b int)(ret int, err error){ //todo } func Add(a, b int)(ret int, err error){ //todo } func Add(a,b int) int { //todo } 2.不定参数 func ...原创 2020-04-26 10:20:32 · 127 阅读 · 0 评论 -
go流程控制
流程控制基本分为以下几个大类: 条件: if if ... else ... if ... else if ... 循环: for range 选择: switch ... case select //C++所没有的关键字 跳转: goto //通常控制流程还会使用以下关键字搭配完成 break continue fallthrough ...原创 2020-04-21 17:07:43 · 144 阅读 · 0 评论 -
go变量及运算
1.与C++定义变量方式不同,go语言定义变量引入关键字 var; var v1 int var v2 string var v3 [4]int //数组 var v4 []int //数组切片 var v5 *int //指针 var v6 map[string]int //map,key为string,value为int类型 var v7 func(a int) string //函数 ...原创 2020-04-16 11:18:55 · 203 阅读 · 0 评论 -
环境搭建和我的第一个go程序
1.开发环境:ubantu; 2.安装go:(打开控制台快捷键 Shift+Alt+T) sudo apt-get update sudo apt-get install golang-go 3.安装完成之后,创建属于自己的go工程目录,我是在/usr/目录下创建GoProject子目录; 如果创建目录失败,则可能需要切换到root用户,属于系统权限问题,自行搜索度娘; cd /us...原创 2020-04-15 10:05:18 · 80 阅读 · 0 评论