Go 是一门简单有趣的编程语言,与其他语言一样,在使用时不免会遇到很多坑,不过它们大多不是 Go 本身的设计缺陷。如果你刚从其他语言转到 Go,那这篇文章里的坑多半会踩到。
如果花时间学习官方 doc、wiki、讨论邮件列表、 Rob Pike 的大量文章以及 Go 的源码,会发现这篇文章中的坑是很常见的,新手跳过这些坑,能减少大量调试代码的时间。
func After(d Duration) <-chan Time
示例
package main import ( "time" "fmt" ) func main() { date := <- time.After(3*time.Second) fmt.Println(date) }
3 秒后会返回一个chan time 数据,程序继续向下执行
func Sleep(d Duration)
package main import ( "time" "fmt" ) func main() { time.Sleep(1*time.Second) fmt.Println("延时1s执行") }
func Tick(d Duration) <-chan Time
这个方法可以间隔的像信道填值,但是没有办法阻止这个过程
示例
package main import ( "time" "fmt" ) func main() { c := time.Tick(1 * time.Second) for now := range c { fmt.Printf("延时执行该做的事情 %s\n", now) } }
type Duration int64
持续时间表示两个瞬间之间的经过时间,为int64纳秒计数。
package main import ( "time" "fmt" ) func main() { // 1s 等于 1000ms second := time.Second fmt.Println(int64(second/time.Millisecond)) // 10s seconds := 10 fmt.Println(time.Duration(seconds)*time.Second) }
func ParseDuration(s string) (Duration, error)
有效时间单位为“ns”,“us”(或“μs”),“ms”,“s”,“m”,“h”
package main
golang 中经常需要格式化时间和日期来满足不同的业务需求,下面总结格式化时间日期中遇到的问题。
golang time包 时间日期格式化定义
go 的time package 提供了time.Format
函数,用来对时间进行格式化输出;类似的还有time.Parse用来解析字符串类型的时间到time.Time。这是两个互逆的函数。
下面看golang中time包对于时间的详细定义
func Caller(skip int) (pc uintptr, file string, line int, ok bool) // skip如果是0,返回当前调用Caller函数的函数名、文件、程序指针PC,1是上一层函数,以此类推
package main import ( "log" "runt
// code_20_struct_method_expression project main.go package main import ( "fmt" ) //方法表达式:也即“方法对象赋值给变量” //两种使用方式: //1)隐式调用, struct实例获取方法对象---->方法值 //2)显示调用, struct类型获取方法对象, 须要传递struct实例对象作为参数。---->方法表达式 type Person struct { name string sex byte age int } func (p *Person) PrintInfoPointer() { fmt.Printf("%p, %v\n", p, p) } func (p Person) PrintInfoValue() { fmt.Printf("%p, %v\n", &p, p) } func main() { //直接调用 p := Person{"ck_god", 'm', 18} p.PrintInfoPointer() fmt.Println("---------------\n") //方法表达式 pFunc1 := (*Person).PrintInfoPointer pFunc1(&p) pFunc2 := Person.PrintInfoValue pFunc2(p) fmt.Println("---------------\n") //方法值 pFunc3 := p.PrintInfoPointer pFunc3() pFunc4 := p.PrintInfoValue pFunc4() fmt.Println("---------------\n") //备注:pFunc2和pFunc4的内存地址是不一样的;pFunc1和pFunc3的内存地址是一致的 }
结果如下:
0xc000050400, &{ck_god 109 18} --------------- 0xc000050400, &{ck_god 109 18} 0xc000050480, {c
曾经听说过一句话,编程的本质就是指针和递归。那会刚开始编码,只是这两个的概念有个感性粗浅的认识。最早接触指针,莫过于C语言了,能否理解用好指针也成为一个合格C语言的基本标志。
Golang也提供了指针,但是go不能进行指针运算,因此相对于C也少了很多复杂度。私以为,go之所以提供指针,并不是为了让你更多和内存打交道,而是提供操作数据的基本桥梁。因为go很多调用,往往复制一份对象,例如函数的
最近在油管上面看了一个视频:Understanding nil,挺有意思,这篇文章就对视频做一个归纳总结,代码示例都是来自于视频。
相信写过Golang的程序员对下面一段代码是非常非常熟悉的了:
if err != nil { // do something.... }
当出现不等于nil
的时候,说明出现某些错误了,需要我们对这个错误进行一些处理
------------------------------------------------------------
Golang中的正则表达式
------------------------------------------------------------
用法:
------------------------------
单一: . 匹配任