1.延迟d秒后返回通过信道返回时间值

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 数据,程序继续向下执行


2.当前的 goroutine 睡眠至少持续时间d 如果d为0或者负值程序立即执行

func Sleep(d Duration)

package main

import (
  "time"
  "fmt"
)
func main() {
  time.Sleep(1*time.Second)
  fmt.Println("延时1s执行")
}


3. 不能被关闭的间隔触发器

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)
  }
}
 

4.计算持续时间

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)
}

5.将字符串解析成功时间格式

func ParseDuration(s string) (Duration, error)
有效时间单位为“ns”,“us”(或“μs”),“ms”,“s”,“m”,“h”

package main
- 以下代码是关于s表达式Pretty打印 ```golang package sexpr import ( "bytes" "fmt" "reflect" ) //限定宽度 const LimitedWidth = 80 func MarshalIndent(value interface{}) (error, []byte) { p := &printer{ width: LimitedWidth, buf: &bytes.Buffer{}, } if err := p.encode(reflect.ValueOf(value)); err != nil {
- `subtle.ConstantTimeCompare([]byte(a), []byte(b))`在[`crypto/subtle`](https://www.php.cn/manual/view/35163.html)库中,该方法当且仅当两个切片 x和y 具有相等的内容时,ConstantTimeCompare 返回1。所花费的时间是切片长度的函数,并且与内容无关。

golang 中经常需要格式化时间和日期来满足不同的业务需求,下面总结格式化时间日期中遇到的问题。

golang time包 时间日期格式化定义
go 的time package 提供了time.Format函数,用来对时间进行格式化输出;类似的还有time.Parse用来解析字符串类型的时间到time.Time。这是两个互逆的函数。

下面看golang中time包对于时间的详细定义

### 阅读cocosbuild源码过程中,发现在生成ccbi文件时,对于不大于65536的整数,可以通过[Elias Gamma Coding](https://blog.csdn.net/sonikk/article/details/8716529)方法来压缩。以下是该方法在golang的具体实现 --- **写整数到文件中** ```golang func (write CCBWrit

runtime.Caller与runtime.FuncForPC

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,挺有意思,这篇文章就对视频做一个归纳总结,代码示例都是来自于视频。

nil是什么

相信写过Golang的程序员对下面一段代码是非常非常熟悉的了:

if err != nil {
    // do something....
}

当出现不等于nil的时候,说明出现某些错误了,需要我们对这个错误进行一些处理

前言

Go 是一门简单有趣的编程语言,与其他语言一样,在使用时不免会遇到很多坑,不过它们大多不是 Go 本身的设计缺陷。如果你刚从其他语言转到 Go,那这篇文章里的坑多半会踩到。

如果花时间学习官方 doc、wiki、讨论邮件列表、 Rob Pike 的大量文章以及 Go 的源码,会发现这篇文章中的坑是很常见的,新手跳过这些坑,能减少大量调试代码的时间。

初级篇:1-34

    Page 1 of 2