http://www.tapirgames.com/blog/golang-tricks
Get the range index.
Block main goroutin forever(using select).
Bits manipulte.
compile-time assertion code in functions identified with the blank identifier
Get the range index.
package main
import "fmt"
func main() {
for i := range (*[10]int)(nil) { // int can be replaced with any type
fmt.Println(i)
}
for i := range [10][0]int{} { // int can be replaced with any type
fmt.Println(i)
}
for i := range [10]struct{}{} {
fmt.Println(i)
}
}
Block main goroutin forever(using select).
package main
import "time"
func main() {
go func() {
for {
time.Sleep(time.Second)
}
}()
select{} // block here for ever
}
Bits manipulte.
const MaxUint = ^uint(0) const MaxInt = int(^uint(0) >> 1) const Is64bitOS = ^uint(0) >> 63 // 1 or 0 const WordBits = 32 << (^uint(0) >> 63) // 64 or 32 import "unsafe" const Is64bitOS = unsafe.Sizeof(1) / 8 const WordBits = unsafe.Sizeof(1) * 8
type I interface {
f()
}
func _() {
var _ I = T{} // assert T implements I
var _ I = (*T)(nil) // assert *T implements I
}
type T struct{}
func (t T) f() {}
const M = 8
const N = 8
func _() {
// methods to assert N >= M
var _ [N-M]int
type _ [N-M]int
const _ uint = N-M
// methods to assert M == N
var _ [M-N]int; var _ [N-M]int
type _ [M-N]int; type _ [N-M]int
const _, _ uint = M-N, N-M
}
Use recover to restart goroutine automatically
package main
import (
"time"
"fmt"
)
func neverExist() {
time.Sleep(time.Second)
panic("crashed.")
}
func autoRestart(f func()) {
defer func() {
recover()
fmt.Println("restart")
go autoRestart(f)
}()
f()
}
func main() {
go autoRestart(neverExist)
select{}
}
Design:
Shadow unwanted variables and types to avoid misusing them carelessly.
i.e The POWER of blocks (c++ alike)
import "database/sql"
func Exec(db *sql.DB, sqlstr string) error {
// using db ...
// ...
// do transaction
tx, err := db.Begin()
if err != nil {
return err
}
// sql.DB and sql.Tx have many same methods,
// to avoid misusing the db variable below,
// we can shaddow it.
{
type db complex64 // shaddow db
// _, err := db.Exec(sqlstr)
// if we call the above line, compiler will report error.
_, err := tx.Exec(sqlstr)
if err != nil {
tx.Rollback()
return err
}
return tx.Commit()
}
}
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.