专栏首页LEo的网络日志go技巧分享(三)

go技巧分享(三)

这是一个系列文章,主要分享go的使用建议和技巧,每次分享3点,希望你能有所收获。

1 打印更易读的结构体

package main

import "fmt"

type User struct {
    Name string
    Age  int
    Addr string
}

func main() {
    u := User{"user1", 12, "addr"}
    fmt.Printf("%v\n", u)
    fmt.Printf("%+v\n", u)
    fmt.Printf("%#v\n", u)
}

/*
{user1 12 addr}
{Name:user1 Age:12 Addr:addr}
main.User{Name:"user1", Age:12, Addr:"addr"}
*/

由示例中可以看到,这里定义了一个叫User的结构体,结构体中有Name、Age和Addr三个字段,第一种打印方式通过%v,只能看到结构体的字段值,如果字段较多,可读性不是很好。第二种打印方式通过%+v,会打印出结构体的每个字段名和相应字段的值。第三种打印方式通过%#v,会打印出结构体的具体类型、字段名称和字段值,方便检查结构的详细信息。所以如果需要在日志中打印具体的结构体信息,可以使用%#v方式。

2 简易定时器实现

package main

import (
    "fmt"
    "time"
)

func main() {
    for range time.Tick(3 * time.Second) {
        fmt.Println(time.Now().Format(time.ANSIC))
    }
}
$ go run timer_demo.go
Mon May 20 14:43:47 2018
Mon May 20 14:43:50 2018
Mon May 20 14:43:53 2018
(省略)

通过使用time包中的Tick函数,可以实现一个简单的定时器,配合for循环可以周期性的执行某些操作。由示例中可以看到,执行示例程序,每隔3s会打印当前的系统时间。

3 正确的字符串连接方式

package main

import (
    "bytes"
    "fmt"
    "time"
)

func main() {
    totalStrs := 100000
    strList := make([]string, 0, totalStrs)
    for i := 0; i < totalStrs; i++ {
        strList = append(strList, fmt.Sprintf("string %d", i))
    }

    joinStrByAdd(strList)
    joinStrByBuffer(strList)
}

func joinStrByAdd(strList []string) string {
    defer Elapsed(time.Now(), "joinStrByAdd")
    joinStr := ""
    for _, str := range strList {
        joinStr += str
    }
    return joinStr
}

func joinStrByBuffer(strList []string) string {
    defer Elapsed(time.Now(), "joinStrByBuffer")
    var joinStr bytes.Buffer
    for _, str := range strList {
        joinStr.WriteString(str)
    }
    return joinStr.String()
}

func Elapsed(start time.Time, funcName string) {
    fmt.Printf("call %s took %f seconds\n", funcName, time.Since(start).Seconds())
}

/*
call joinStrByAdd took 24.579838 seconds
call joinStrByBuffer took 0.002363 seconds
*/

通过bytes.Buffer的缓存机制,在连接大量字符串时,可以大大的提升性能。由示例中可以看到,这里模拟了10万个字符串连接操作,使用传统的加号方式和使用bytes.Buffer方式,性能相差上万倍。其实不止go语言提供了这种缓存机制,大多数语言都有类似方式实现字符串连接。

LEo at 00:05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python技巧分享(九)

    songleo
  • 广度优先搜索算法(go)

    songleo
  • linux应用如何进行cpu绑定

    songleo
  • 轻量级.Net Core服务注册工具CodeDi发布啦

    因为我们的系统往往时面向接口编程的,所以在开发Asp .net core项目的时候,一定会有大量大接口及其对应的实现要在ConfigureService注册到S...

    码农阿宇
  • 基于Prometheus搭建SpringCloud全方位立体监控体系

    最近公司在联合运维做一套全方位监控的系统,应用集群的技术栈是SpringCloud体系。虽然本人没有参与具体基础架构的研发,但是从应用引入的包和一些资料的查阅大...

    Throwable
  • 【JavaScript】ESlint & Prettier & Flow组合,得此三神助,混沌归太清

    Flow是faceBook开源的一个JavaScript静态类型检查工具,作用类似TypeScript,但是它不像TS那样是一门独立的语言,而是作为一个babe...

    外婆的彭湖湾
  • 你所坚信的,就是你的生活

    几经折腾,买的笔记本终于到了,刚开始买的是一个稍微大一点15.6的,用起来挺好,就是不方便携带,而来上海之后因为没带仅有的那台台式电脑,所以必须买一个小一点,方...

    Java中文社群_老王
  • Linux系统中修改文件夹及文件读写权限

    如果目录下的所有文件都需要以管理员的方式进行文件的复制,创建,和移动。比如我的data目录 ,此时只需要。

    herve
  • 动态代理和nanning AOP-2 实现Introduction

    <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

    田春峰-JCJC错别字检测
  • 美国科学家研究出无需训练的神经网络,能帮助机器像人类一样思考

    原标题:美国科学家研究出无需训练的神经网络,能帮助机器像人类一样思考 近日,由密歇根大学电气工程和计算机科学教授 Wei Lu 研究团队在《自然·通信》上发表了...

    企鹅号小编

扫码关注云+社区

领取腾讯云代金券