赞
踩
目前使用golang 进行项目开发已经有一年多了,针对很多代码优化有一些心得体会以文字的形式输出做个总结。
另外,我们可以看到,Go 语言的编译器并没有严格检查一个对象是否实现了某接口所有的接口方法,如下面这个示例:
type Shape interface {
Sides() int
Area() int
}
type Square struct {
len int
}
func (s* Square) Sides() int {
return 4
}
func main() {
s := Square{len: 5}
fmt.Printf("%d\n",s.Sides())
}
可以看到,Square 并没有实现 Shape 接口的所有方法,程序虽然可以跑通,但是这样的编程方式并不严谨,如果我们需要强制实现接口的所有方法,那该怎么办呢?在 Go 语言编程圈里,有一个比较标准的做法:
var _ Shape = (*Square)(nil)
声明一个 _ 变量(没人用)会把一个 nil 的空指针从 Square 转成 Shape,这样,如果没有实现完相关的接口方法,编译器就会报错。
时间有时区、格式、精度等问题,其复杂度不是一般人能处理的。所以,一定要重用已有的时间处理,而不是自己干。在 Go 语言中,你一定要使用 time.Time 和 time.Duration 这两个类型。
最后,如果你要做全球化跨时区的应用,一定要把所有服务器和时间全部使用 UTC 时间。性能提示
当我们复制一个对象时,这个对象可以是内建数据类型、数组、结构体、Map……在复制结构体的时候,如果我们需要比较两个结构体中的数据是否相同,就要使用深度比较,而不只是简单地做浅度比较。这里需要使用到反射 reflect.DeepEqual() ,下面是几个示例:
import ( "fmt" "reflect" ) func main() { v1 := data{} v2 := data{} fmt.Println("v1 == v2:",reflect.DeepEqual(v1,v2)) //prints: v1 == v2: true m1 := map[string]string{"one": "a","two": "b"} m2 := map[string]string{"two": "b", "one": "a"} fmt.Println("m1 == m2:",reflect.DeepEqual(m1, m2)) //prints: m1 == m2: true s1 := []int{1, 2, 3} s2 := []int{1, 2, 3} fmt.Println("s1 == s2:",reflect.DeepEqual(s1, s2)) //prints: s1 == s2: true }
Go 语言是一个高性能的语言,但并不是说这样我们就不用关心性能了,我们还是需要关心的。下面我给你提供一份在编程方面和性能相关的提示。
package main import ( "bytes" "strings" "testing" ) var strLen int = 1000 func BenchmarkConcatString(b *testing.B) { var str string i := 0 b.ResetTimer() for n := 0; n < b.N; n++ { str += "x" i++ if i >= strLen { i = 0 str = "" } } } func BenchmarkConcatBuffer(b *testing.B) { var buffer bytes.Buffer i := 0 b.ResetTimer() for n := 0; n < b.N; n++ { buffer.WriteString("x") i++ if i >= strLen { i = 0 buffer = bytes.Buffer{} } } } func BenchmarkConcatBuilder(b *testing.B) { var builder strings.Builder i := 0 b.ResetTimer() for n := 0; n < b.N; n++ { builder.WriteString("x") i++ if i >= strLen { i = 0 builder = strings.Builder{} } } }
LWTdeMBP:benchmarks lwt$ go test -bench=. -benchmem
goos: darwin
goarch: amd64
BenchmarkConcatString-8 8688772 126 ns/op 530 B/op 0 allocs/op
BenchmarkConcatBuffer-8 163425741 7.25 ns/op 2 B/op 0 allocs/op
BenchmarkConcatBuilder-8 465009902 2.64 ns/op 2 B/op 0 allocs/op
PASS
ok _/Users/lwt/benchmarks 4.677s
LWTdeMBP:benchmarks lwt$
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。