随笔分类 - Go
Go语言开发中经常遇到的一些技术
摘要:package main import ( "bufio" "fmt" "io" "strings" ) type intGen func() int func (g intGen) Read(p []byte) (n int, err error) { next := g() if next > 10000 { //因为是斐波那契额数列,所以...
阅读全文
摘要:package main import ( "fmt" "sync" "time" ) func add(i *int, mutex *sync.Mutex) { mutex.Lock() *i++ mutex.Unlock() } func main() { var mutex sync.Mutex //声明锁的时候不要用指针,锁需要...
阅读全文
摘要:命令行参数,向整个函数传参 go run xxx.go argv1 argv2 os.Args package main import ( "fmt" "os" ) func main() { fmt.Println(os.Args) } 来自为知笔记(Wiz)
阅读全文
摘要:slice的实现 切片的结构定义 type SliceHeader struct{ Data uintptr Len int Cap int } //由上述代码可以看出切片的开头部分和Go字符串一样,但是切片多了一个Cap成员来表示切片指向的内存空间的最大容量(对应元素的个数,而不是字节数) 切片的定义方式 var ( a []int b = []int{} ...
阅读全文
摘要:类型断言传递的是实例值的副本,如果实例是指针,则是指针的副本 package main import "fmt" func main() { var a = 34 var i interface{} = &a o := i.(*int) fmt.Println(i, o) } // output: 0xc4200160a0 0xc4200160a0来自为...
阅读全文
摘要:package main import "fmt" type A struct{ } func (a *A) Say(){ fmt.Print("haha") } func main(){ var a A a.Say() //方法绑定的是实例指针编译器会自动把实例转成指针类型传到方法中,反之如果方法绑定的是实例,指针也会被编译器自动转成实例传入到方法内部 (&a).Say(...
阅读全文
摘要:支持匿名接口类型,可直接用为变量定义,或结构体字段 package main type data struct { } func (data) string() string { return "haha" } type node struct { data interface { string() string //匿名接口类型 } } fun...
阅读全文
摘要:package main import ( "bufio" "fmt" "io" "strings" ) type intGen func() int //正规的函数式编程都是先定义函数类型 func fibonacci() intGen { //声明一个返回intGen类型的斐波那契生成器 a, b := 0, 1 return func...
阅读全文
摘要:使用反射机制,编写函数的适配器,桥连接 test1 := func(v1 int, v2 int){ t.Log(v1,v2) } 基本介绍 反射可以在运行时动态获取变量的各种信息,比如变量的类型,类别 如果是结构体变量,还可以获取到结构体本身的信息(包括字段,方法) 通过反射,可以修改变量的值可以调用关联的方法 使用反射,需要import("reflect") 变量 inte...
阅读全文
摘要:package main import ( "fmt" "net" "strings" "time" ) type Client struct { C chan string Name string Addr string } //创建全局map,存储在现空间 var onlineMap map[string]Client //...
阅读全文
摘要:主要内容: 由对象获取反射类型,由对象获取反射值 由反射值获取反射类型 反射值重新转换成对象 遍历字段 遍历方法 易知go语言的struct是值类型,如果修改需要使用引用传递。反射修改值类型,要获取其指针的值类型。此方法适用于int string 以及struct。 反射调用的注意点: 类方法要大写,以便能被其它包,也就是reflect包调用。小写的方法可以由反射查询,但是不能调用。 要获取...
阅读全文
摘要:周期定时器 func main() { timer := time.NewTicker(1 * time.Second) //NewTicker是周期定时器,NewTimer是普通定时器只能用一次 for { <-timer.C fmt.Println("good") } } 定时器 time.Sleep(time.Secon...
阅读全文
摘要:go语言中的包 一个目录下的统计文件归属一个包,package的声明要一致 package声明的包和对应的目录名可以不一致,但习惯上还是可以写成一直的 包可以嵌套 同包下的函数不需要导入包,可以直接使用 main包,main函数所在的包,其他包不可以引用 点操作 import ( . "fmt" ) func main(){ println("haha") //使用...
阅读全文
摘要:const定义在main函数里面就是局部常量 package main import "fmt" func add(a int) func(int) int { return func(i int) int { fmt.Println(&a) a += i return a } } func main() { cons...
阅读全文
摘要:闭包对闭包外的环境引入是直接引用,编译器监测到闭包,会将闭包饮用的外部变量分配到堆上 package main func fa(a int) func(i int) int { return func(i int) int { fmt.println(&a) a = a + i return a } } func main() ...
阅读全文
摘要:## 创建巨大字符串时性能提升的方法 package main import ( "bytes" "fmt" ) func test() string{ var b bytes.Buffer b.Grow(1000) //将buffer的容量提升到1000,然后写入到字符中 for i :=0;i<1000;i++{ b.WriteS...
阅读全文
摘要:package main import ( "fmt" "runtime" ) func test() { defer fmt.Println("ccccccccc") //只要成功注册了无论是return 还是goexit都会被调用 runtime.Goexit() //退出函数所在当前go程 defer fmt.Println("dddddddddd...
阅读全文
摘要:package main import "fmt" type optionClient func(*options) func setAge(a int) optionClient { return func(o *options) { o.Age = a } } func setSex(s int) optionClient { return func(o ...
阅读全文
摘要:go语言在for循环中遍历的临时变量地址是一样的 func main() { //SetLogConfToEtcd() for i := 0; i < 5; i++ { a := i fmt.Printf("%p\n", &i) //可以看到i的地址都是一样的,也就是说i是复用的 fmt.Printf("%p\n", &a) //...
阅读全文
摘要:单行模式(?s:(.?))万能用法尽量匹配少的文本,最关键的是可以匹配换行的文本,直接写.?不能匹配\n package main import ( "fmt" "regexp" ) func main() { str := "3.14 23.22 abc a7c 2.43 mfc cat 8ca azc cba" //解析,编译正则表达式 ret :...
阅读全文

浙公网安备 33010602011771号