Table of Contents
虽然推荐使用
go get -u golang.org/x/sync
但很不幸,国内无法连接golang.org
,所以只能曲线救国,借助github.com来安装相关的package
git clone https://github.com/golang/sync ./ # 或者 git clone https://github.com/golang/sync mv sync $GOPATH/src/golang/x/
读取配置文件
注: Configuration 里元素(Path)必须大写开头
import ( "encoding/json" "flag" "fmt" "io/ioutil" ) type Configuration struct { Path string } const VETSION = "0.1.0" var ( config Configuration ) func init() { var ( conf_file string print_ver bool ) flag.StringVar(&conf_file, "c", "etc/config.json", "config file") flag.BoolVar(&print_ver, "v", false, "config file") flag.Parse() raw, err := ioutil.ReadFile(conf_file) if err != nil { log.Error("config parse fail!") os.Exit(1) } err = json.Unmarshal(raw, &config) if err != nil { log.Error("config unmarshal fail!") os.Exit(1) } if print_ver { fmt.Println("version:", VERSION) os.Exit(0) } }
判断文件是否存在
import ( "os" ) func file_is_exists(f string) bool { _, err := os.Stat(f) if os.IsNotExist(err) { return false } return err == nil }
随机睡眠
import ( "math/rand" "time" ) func random_sleep(t int) { rand.Seed(time.Now().Unix()) time.Sleep(time.Duration(rand.Intn(t)) * time.Microsecond) }
字符串
随机的n位字符串
var letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") func randStringRunes(n int) string { rand.Seed(time.Now().UnixNano()) b := make([]rune, n) for i := range b { b[i] = letterRunes[rand.Intn(len(letterRunes))] } return string(b) }
字符串连接
import ( "bytes" ) func string_concat(s ...string) string { var buffer bytes.Buffer for _, i := range s { buffer.WriteString(i) } return buffer.String() }
检查元素是否在map中
func check_in_map(f map[string]string, v string) bool { if _, ok := f[v]; ok { return true } return false }
检查元素是否在list中
func check_in_list(f []string, v string) bool { for i := range f { if f[i] == v { return true } } return false }
执行Linux命令
import ( "os/exec" ) func exec_command(command string, args ...string) (error, bool) { var ( err error ) cmd := exec.Command(command, args...) cmd.Start() done := make(chan error) go func() { done <- cmd.Wait() }() select { case <-time.After(600 * time.Second): if err = cmd.Process.Kill(); err != nil { log.Error("failed to kill: %s, error: %s", cmd.Path, err) } go func() { <-done // allow goroutine to exit }() log.Info("process:%s killed", cmd.Path) return err, true case err = <-done: return err, false } }
迭代文件目录
func file_iter(path string) []string { // path must be abs path var files []string scripts, _ := ioutil.ReadDir(path) for _, script := range scripts { if script.IsDir() { return file_iter(filepath.Join(path, script.Name())) } files = append(files, filepath.Join(path, script.Name())) } return files }
求两列表的差集
func difference(a,b []string) []string { // len(a) < len(b), avoid all item of a belong to b m := map[string]bool{} for _, x := range a { m[x] = true } diff := []string{} for _, x := range b { if _, ok := m[x]; !ok { diff = append(diff, x) } } return diff }
删除列表中重复的数据
func RemoveDuplicates(elements []string) []string { keys := map[string]bool{} result := []string{} for _, element := range elements { if _, value := keys[element]; !value { keys[element] = true result = append(result, element) } } return result }
参数校验
是否是IP
func IsValidIP(key string) bool { IP := net.ParseIP(key) if IP == nil { return false } return true }
是否是EMAIL
import "regexp" func IsValidEmail(key string) bool { re := regexp.MustCompile("^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$") if !re.MatchString(key) { return false } if strings.HasSuffix(key, "@upai.com") || strings.HasSuffix(key, "@huaban.com") { return true } return false }
读取http响应的gz package
func main() { resp, _ := HTTPRequest("GET", "http://some-gz-package/package-name", nil) defer resp.Body.Close() gz, err := gzip.NewReader(resp.Body) if err != nil { fmt.Println(err.Error()) return } defer gz.Close() scanner := bufio.NewScanner(gz) for scanner.Scan() { fmt.Println(scanner.Text()) } }