Golang
陈鹏万里
Gopher
展开
-
golang动态规划求解最大连续子数组和
// 求最大连续子数组和func MaxSubArray(arr []int) int { currSum := 0 maxSum := arr[0] for _, v := range arr { if currSum > 0 { currSum += v } else { currSum =原创 2017-05-15 16:17:25 · 1217 阅读 · 0 评论 -
Golang(Go语言)内置函数之append
append主要用于给某个切片(slice)追加元素如果该切片存储空间(cap)足够,就直接追加,长度(len)变长;如果空间不足,就会重新开辟内存,并将之前的元素和新的元素一同拷贝进去第一个参数为切片,后面是该切片存储元素类型的可变参数 基础用法:slice := append([]int{1,2,3},4,5,6)fmt.Println(slice) //[1 2 3原创 2016-02-23 14:20:50 · 52878 阅读 · 3 评论 -
golang语法总结(二十二):接口interface
类型关键字为interface不需要显式声明实现某个接口,只要实现相关方法就实现了接口 基本示例:type Person interface { Name() string}type Student struct { name string}func (s Student)Name() string { return s.name}func main() { var p原创 2016-02-23 14:15:43 · 1703 阅读 · 0 评论 -
golang语法总结(二十一):方法method
Go不像其它面相对象语言一样可以写个class,然后在class里面写一堆方法,但是它也很巧妙的实现了这种效果,我们只需要在普通函数前面加个接受者(receiver,写在函数名前面的括号里面),这样编译器就知道这个函数(方法)属于哪个struct了。 下面是简单示例:type A struct { Name string} func (a A)foo() { //接收者原创 2016-02-23 14:14:53 · 4283 阅读 · 1 评论 -
golang语法总结(二十):struct组合
Go的struct可以嵌入组合其它struct,有点像是继承,下面是示例:type human struct { Sex int}type person struct { human //嵌入结构,只需要写出结构类型 Name string Age int}func main() { a := person{ Name:"cpwl", Age : 21, human : huma原创 2016-02-22 18:33:32 · 6757 阅读 · 0 评论 -
golang语法总结(十九):结构struct
Go没有class,也没有继承机制,只能定义结构体,但是功能还是很强大。本文先演示下它的基本用法。简单使用示例:type person struct { Name string Age int}func main() { a := person{ //声明的时候可以赋初始值,也可以不要 Name:"cpwl", Age : 21, } a.Name原创 2016-02-22 18:32:36 · 2600 阅读 · 0 评论 -
golang语法总结(十七):函数
用关键字func定义可以有多个返回值func main(){ f1() //f1 a,b := f2(1,1.2) fmt.Println(a,b) //4.34 2 c,d,e := f3() fmt.Println(c,d,e) //1 2 3 f4("OK",1,2,3,4) //OK [1 2 3 4] f5() //hello world f := f6(2) fmt.P原创 2016-02-22 14:06:03 · 1084 阅读 · 0 评论 -
算法代码实现之冒泡排序,Golang(Go语言)实现
有两种相似的方式:func swap(slice []int, i int, j int) { slice[i], slice[j] = slice[j], slice[i]} //第一种冒泡排序func BubbleSort1(slice []int) { length := len(slice) max := length - 1 for i := 0;原创 2016-02-27 19:59:39 · 1229 阅读 · 0 评论 -
算法代码实现之选择排序,Golang(Go语言)实现
封装成函数://交换数组元素func swap(slice []int, i int, j int) { slice[i], slice[j] = slice[j], slice[i]} //选择排序func SelectionSort(s []int) { l := len(s) //以免每次循环判断都运算 m := len(s)-1 for i:=0;im;i++ { k:原创 2016-02-27 21:03:34 · 1110 阅读 · 0 评论 -
算法代码实现之Union-Find,Golang(Go语言)实现,quick-find、quick-union、加权quick-union(附带路径压缩优化)
本算法主要解决动态连通性一类问题,这里尽量用精炼简洁的话来阐述。数据结构描述:有N个节点(索引0~N-1),可以查询节点数量可以连接两个节点可以查询两个节点是否连通算法大致设计思路:每个节点初始化为不同的整数标记通过一个辅助函数查询某个节点的标记值如果两节点标记相同,说明两节点是连通的用一个包专门处理union-find算法(unionfind)定义原创 2016-02-28 12:34:27 · 2099 阅读 · 0 评论 -
算法代码实现之插入排序,Golang(Go语言)实现
封装成函数://插入排序func InsertionSort(s []int) { n := len(s) if n 2 { return } for i := 1; i n; i++ { for j := i; j > 0 && s[j] s[j - 1]; j-- { swap(s, j, j - 1) } }} func swap(slice []int, i i原创 2016-02-28 15:33:23 · 961 阅读 · 0 评论 -
Golang(Go语言)中append函数返回值必须有变量接收的原因探究
append函数返回更新后的slice(长度和容量可能会变),必须重新用slice的变量接收,不然无法编译通过 为了弄明白为什么,首先我们需要清楚几件事:slice的底层是数组,一片连续的内存,slice变量只是存储该slice在底层数组的起始位置、结束位置以及容量。它的长度可以通过起始位置和结束位置算出来,容量也可以通过起点位置到底层数组的末端位置的长度原创 2016-02-23 14:17:23 · 6922 阅读 · 0 评论 -
Golang(Go语言)内置函数之copy用法
该函数主要是切片(slice)的拷贝,不支持数组将第二个slice里的元素拷贝到第一个slice里,拷贝的长度为两个slice中长度较小的长度值示例:s := []int{1,2,3}fmt.Println(s) //[1 2 3]copy(s,[]int{4,5,6,7,8,9})fmt.Println(s) //[4 5 6]有一种特殊用法,将字符串当成原创 2016-02-24 21:32:16 · 21219 阅读 · 0 评论 -
Go语言(golang)包设计哲学/原则与项目结构组织最佳实践
总结下Go的package设计哲学明确目的 在准备设计一个包之前,我们需要明确它的目的。包的命名就必须明确体现其目的,而不仅仅是为了存放代码。像标准库的io,http,fmt这些包名就很好,而像util.helper,common这种命名就是反面教材。可用性 想想使用这个包的人真正的需求,包的使用一定要直观、简单。在不断迭代开发、优化、完善的时候,不能让引用这个的程序出错。防止出现需要原创 2017-04-02 21:24:38 · 4857 阅读 · 0 评论 -
Go语言技巧:使用for range time.Tick()固定间隔时间执行
直接上代码,比如每隔30ms重绘界面:for range time.Tick(30 * time.Millisecond) { repaint()}因为time.Tick()返回的是一个channel,每隔指定的时间会有数据从channel中出来,for range不仅能遍历map,slice,array还能取出channel中数据,range前面可以不用变量接收,所以可以简写成上面的形式原创 2017-02-23 23:40:53 · 8867 阅读 · 0 评论 -
Go语言技巧:使用select{}阻塞main函数
很多时候我们需要让main函数不退出,让它在后台一直执行,例如:func main() { for i := 0; i < 20; i++ { //启动20个协程处理消息队列中的消息 c := consumer.New() go c.Start() } select {} // 阻塞}可能大多数人想到阻塞的方法是用channel,当然都是可以原创 2017-02-23 22:59:42 · 13418 阅读 · 3 评论 -
解决Jetbrains的开发工具不能运行或调试(run/debug)go/golang程序[Intellj Idea,Webstorm,PyCharm,PhpStrom,Android Studio]
Go插件首先确保装了go插件:Files-Settings-Plugins-Browse repositories,搜索Go,然后Install设置Project SDK需要给你打开的项目设置一个Go的SDK它才能辨别这是Go的项目,如果没设置请先设置:File-Project Structure,选择Go的SDK,如果还没添加就New一个 设置完后根据提示Reload一下Run packag原创 2016-09-29 10:24:47 · 16467 阅读 · 0 评论 -
golang(Go语言) byte/[]byte 与 二进制形式字符串 互转
效果把某个字节或字节数组转换成字符串01的形式,一个字节用8个”0”或”1”字符表示。比如: byte(3) –> “00000011” []byte{1,2,3} –> “[00000001 00000010 00000011]” “[00000011 10000000]” –> []byte{0x3, 0x80}开源库 biu实际上我已经将其封装到一个开源库了(biu),其中的一个功能就能原创 2016-09-28 20:03:49 · 54956 阅读 · 0 评论 -
求两圆交点算法代码实现(Golang/Go语言)
数学求解原理请看:http://blog.csdn.net/qq245671051/article/details/52017403下面是golang代码实现:package mainimport ( "math")//代表一个点,包含横纵坐标type Point struct { X, Y float64}//代表一个圆,包含横纵坐标及半径原创 2016-07-25 15:10:56 · 1697 阅读 · 0 评论 -
Golang(Go语言)读取文件基本用法
需要用到os和bufio包import "os"import "bufio"用os.Open打开一个文件,用bufio.NewReader来读取文件file, err := os.Open("input.dat")if err!= nil { fmt.Println("failed to open") return}defer file.Close()reade原创 2016-02-24 21:34:42 · 3778 阅读 · 0 评论 -
Golang(Go语言)代码技巧之数组(array)和切片(slice)
去掉最后n个元素line = line[:len(line)-n]两种遍历方式for i:=0;ilen(line);i++{ // ...=line[i]}for index,value:=range line { //...}二维数组中查询某个值是否存在found := falseLABEL:for row :原创 2016-02-24 21:33:28 · 5369 阅读 · 0 评论 -
Golang(Go语言)代码技巧之字符串(string)
改变字符串中的某些字符str := "hello roc"bytes := []byte(str)bytes[1] = 'a'str = string(bytes) //str == "hallo roc"截取子串substr := str[n:m] //截取从索引n到m-1的子串遍历字符串//for遍历,此方式只能遍历存放ASCII//编码原创 2016-02-24 21:32:55 · 24123 阅读 · 0 评论 -
算法代码实现之希尔排序,Golang(Go语言)实现
封装成函数:package sort func ShellSort(a []int) { n := len(a) h := 1 for h n/3 { //寻找合适的间隔h h = 3*h + 1 } for h >= 1 { //将数组变为间隔h个元素有序 for i := h; i n; i++ { //间隔h插入排序 for j := i; j >= h &&原创 2016-02-28 16:12:28 · 1252 阅读 · 0 评论 -
算法代码实现之归并排序,Golang(Go语言)实现,自顶向下与自底向上两种方式
封装成函数://自顶向下归并排序func MergeSortUpToDown(s []int) { aux := make([]int, len(s)) //辅助切片 mergeSortUpToDown(s, aux, 0, len(s)-1)} //自底向上归并排序func MergeSortDownToUp(s []int) { aux := make([]int, len(s))原创 2016-02-28 21:23:56 · 1812 阅读 · 0 评论 -
golang语法总结(十一):判断语句if
条件表达式没有括号 支持初始化表达式 初始化语句的变量自在本block内有效if a,b,c := 1,2,3;a+b+c>6 { fmt.Println("haha")}else{ fmt.Println("hehe")}原创 2016-02-22 13:40:28 · 3038 阅读 · 0 评论 -
golang语法总结(十):关于++和--
和其它语言有很大不同,它只能放在变量的后面而不能放在前面,而且只能作为一条语句而不是表达式。举个栗子:var i =1var j = i++这段代码将不同通过编译原创 2016-02-22 13:38:20 · 2753 阅读 · 0 评论 -
golang语法总结(八):类型零值、类型别名、类型转换
类型零值 变量声明为某种类型后的值就为该类型的零值,它不是空值。通常数值类型默认为0,bool为false,string为空字符串类型别名比如:type text stringfunc main() { var t text = "hello world" fmt.Println(t)}类型转换原创 2016-02-22 13:30:24 · 4073 阅读 · 0 评论 -
golang语法总结(七):常量计数器
关键字为iota,没遇到一个const关键字就会置为0,然后递增。还有就是如果定义常量组,没有赋值的编译器会自动将其赋值表达式置为和它前面那个变量的表达式一样 const ( A = 55 B = iota C D)func main() { fmt.Println(A) fmt.Println(B) fmt.Println(C) fmt.Println(D)}原创 2016-02-22 13:27:23 · 1807 阅读 · 0 评论 -
golang语法总结(六):常量声明与赋值
常量的值必须在编译时期就确定下来,所以要么直接给出确定的值,要么使用Go自带的函数(比如len(),计算长度); 用const关键字声明 定义与赋值示例:const _THRESHOLD int = 10 //完整形式const PI = 3.14 //可省略类型,编译器自动推断const STR = "hello world"const (原创 2016-02-22 13:14:55 · 1988 阅读 · 0 评论 -
golang语法总结(五):变量声明与赋值
变量声明与赋值示例:var i int = 1 //var关键字声明一个变量,紧跟一个变量名,然后是变量类型,最后是赋值var hehe = "hehe" //可以省略变量类型,编译器根据赋值的类型自动推算变量的类型var a,b,c,d = 1,2,3.14,4 //同时申明多个并赋值j := 10 //省略var关键字如果是全局的变量,还可以这样:原创 2016-02-22 13:12:05 · 6897 阅读 · 0 评论 -
golang语法总结(四):基本数据类型
整型有:int8/uint8、int16/uint16、int32/uint32、int64/uint64、int/uint、byte、rune1) 数字表示占多少位,uint的u表示unsigned,有点C语言基础的都知道是什么意思,这里就不赘述了;2) int/uint会根据运行平台可能为32位或64位;3) rune相当于int32的别名4原创 2016-02-22 13:07:20 · 1634 阅读 · 0 评论 -
Golang语法总结(三):可见性规则(公有与私有,访问权限)
Go语言没有像其它语言一样有public、protected、private等访问控制修饰符,它是通过字母大小写来控制可见性的,如果定义的常量、变量、类型、接口、结构、函数等的名称是大写字母开头表示能被其它包访问或调用(相当于public),非大写开头就只能在包内使用(相当于private,变量或常量也可以下划线开头) 例如: visibility/test.go原创 2016-02-22 12:58:56 · 10582 阅读 · 0 评论 -
Golang语法总结(二):程序结构
源文件后缀为:.go,比如 hello.goGo程序是用package来组织的,在源文件第一个非注释行声明包,比如:package main只有package为main的包才能包含main函数(程序的入口),并且一个可执行程序有且仅有一个main包通过import关键字导入其它包,两种用法: 1.导入单个包:import "fmt" 2.导入多个包:原创 2016-02-22 10:43:56 · 1078 阅读 · 0 评论 -
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原创 2016-02-22 10:42:35 · 15497 阅读 · 0 评论 -
golang语法总结(十二):循环语句
Go循环只有for关键字,没有while,但可以达到同样的效果for a,b:=1,2;a+b100;a++ { fmt.Println(a+b)}i := 1for i100 { fmt.Println(i) i++}i = 1for{ if i>100 { break } fmt.Println(i) i++}原创 2016-02-22 13:42:23 · 7624 阅读 · 0 评论 -
golang语法总结(十三):选择语句switch
条件语句可以使用任何类型或表达式,甚至不填不需要写break,一旦条件符合自动终止,如果希望继续执行下一个case,需使用fallthrough支持初始化表达式,右侧跟分号var a int = 1switch {case a>=1: fmt.Println("a>=1")case a>=0: fmt.Println("a>=0")}var a int =原创 2016-02-22 13:44:46 · 3264 阅读 · 0 评论 -
算法代码实现之快速排序,Golang(Go语言)实现
封装成函数://快速排序func QuickSort(s []int) { sort(s, 0, len(s)-1)} func sort(s []int, lo, hi int) { if lo >= hi { return } k := partition(s, lo, hi) sort(s, lo, k) sort(s, k+1, hi)} func partition(s [原创 2016-02-29 19:18:33 · 1247 阅读 · 0 评论 -
算法代码实现之三向切分快速排序,Golang(Go语言)实现
封装成函数://三向切分快速排序func ThreeWayQuickSort(s []int) { sort3way(s, 0, len(s)-1)} //在lt之前的(lo~lt-1)都小于中间值//在gt之前的(gt+1~hi)都大于中间值//在lt~i-1的都等于中间值//在i~gt的都还不确定(最终i会大于gt,即不确定的将不复存在)func sort3way(s []int,原创 2016-02-29 21:34:47 · 1060 阅读 · 0 评论 -
算法代码实现之堆排序,Golang(Go语言)实现
封装成函数://堆排序//s[0]不用,实际元素从角标1开始//父节点元素大于子节点元素//左子节点角标为2*k//右子节点角标为2*k+1//父节点角标为k/2func HeapSort(s []int) { N := len(s) - 1 //s[0]不用,实际元素数量和最后一个元素的角标都为N //构造堆 //如果给两个已构造好的堆添加一个共同父节点, //将新添加的节点作一次下原创 2016-03-01 20:41:33 · 2341 阅读 · 2 评论 -
算法代码实现之选出第k小元素、中位数、最小的k个元素(线性复杂度),Golang(Go语言)实现
封装成函数://选出第k小元素,k为1~len(s)func SelectKthMin(s []int, k int) int { k-- lo, hi := 0, len(s)-1 for { j := partition(s, lo, hi) if j k { lo = j + 1 } else if j > k { hi = j - 1 } else { r原创 2016-03-02 21:25:48 · 1304 阅读 · 0 评论