随笔---平衡

美国首富开始造卫星的互联网了,我想我们应该怎么做,怎么才能给国家做这个事情,就是要做到这个事情,我们需要那些产业链。

其实我们还有很多事情可以做,就算不用原创,我们单单追着美国大哥走,也能学到好多东西呢。

所以还是要继续深造,感觉将来的东西还是非常有趣的。

包括机器人啊,各种高科技。

另外,我还有另外一个愿望,我还是想有机会买下一个上市公司的。

当然这个也不怎么花时间精力,更多也是等而已,反正是都是赌的。

也是看概率的事情,目标当然是每个月6%的收益率,那么一年的收益率就有100%以上当然这是理想的情况。

但是至少还有组合的基石在,这样我就能大胆放心地去创了

package common

import "bytes"
import "time"
import "strings"
import "strconv"
import "fmt"
import "encoding/json"
import "encoding/csv"
import "io/ioutil"
import "io"
import "math"
import "log"
import "os"
import "path/filepath"
import "net/http"
import "bufio"
import "os/exec"
import "archive/zip"
import "mime/multipart"
import "reflect"
import "net"

// ------------------------- common version ----------------------
var CommonVersion string = "v0.1.15"
var Desciption string = "Add DoSomething function."

func DoSomething(){
	// 占位函数
	log.Println("do something")
}

func Pass(){
	// 如题,作用类似python 中的pass

}

/* ----------------------------进程相关----------------------------*/
func SimpleExec(args ...string){
    // function : 执行子进程
    // param : 子进程shell命令
    var arg []string
	if len(args) > 1 {
		arg = args[1:]
	}
    cmd := exec.Command(args[0], arg...)
    log.Println("exec command : ",cmd.String())
    err:= cmd.Run()
    if (err!=nil){
        log.Println("exec error : ",err)
    }
}

func StdinExec(input string,args ...string){
	// function : 
	// param args : 子进程shell命令
	// param input : stdin 后续输入,比如Ubuntu权限问题
	var arg []string
	if len(args) > 1 {
		arg = args[1:]
	}
    cmd := exec.Command(args[0], arg...)
	cmd.Stdin = strings.NewReader(input)
    log.Println("exec command : ",cmd.String())
    err:= cmd.Run()
    if (err!=nil){
        log.Println("exec error : ",err)
    }
}

func RedirectErrorExec(redirectPath string,args ...string){
	// 重定向的子进程执行
	var arg []string
	if len(args) > 1 {
		arg = args[1:]
	}
	
	f, _ := os.OpenFile(redirectPath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
	defer f.Close()
	
    cmd := exec.Command(args[0], arg...)
    log.Println("exec command : ",cmd.String())
	cmd.Stderr = f     // 捕获异常输出
	err:= cmd.Run()
    if (err!=nil){
        log.Println("exec error : ",err)
    }
}

func RedirectStdoutExec(redirectPath string,args ...string){
	// 重定向的子进程执行
	var arg []string
	if len(args) > 1 {
		arg = args[1:]
	}
	
	f, _ := os.OpenFile(redirectPath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
	defer f.Close()
	
    cmd := exec.Command(args[0], arg...)
    log.Println("exec command : ",cmd.String())
	cmd.Stdout = f     // 捕获异常输出
	err:= cmd.Run()
    if (err!=nil){
        log.Println("exec error : ",err)
    }
}

/*-----------------------------网络请求-----------------------------*/
func Get(url string) (string,error){
	// get请求
	res,err:=http.Get(url)
	if err!=nil{
		log.Println("http get address : ",url,"http error : ",err)
	}

	body,err:=ioutil.ReadAll(res.Body)
	return string(body),err
}

func GetHTMLResponse(address string)(*http.Response,error){
	// function : 通过一个网址获取该网页的html对象
	// param address : 网页链接
	// return : 一个http的返回对象
	resp,err:=http.Get(address)
	if err != nil{
		fmt.Println("请求获取html失败 :",err)
	}

	return resp,err
}


func Post(url string, data interface{}, contentType string) string {
    // example:
    // var url string="http://192.168.209.128:8080/paramPostServer?"+quantity
	// data:=map[string]string{"execFilePath":"string aaa","resultPath":"string bbb"}
	// var result string=Post(url,data,"application/json")
    // 超时时间:5秒
    client := &http.Client{Timeout: 5 * time.Second}
    jsonStr, _ := json.Marshal(data)
    resp, err := client.Post(url, contentType, bytes.NewBuffer(jsonStr))
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    result, _ := ioutil.ReadAll(resp.Body)
    return string(result)
}

func post(url string)(string,error){
	// function : http post requests
	// TODO : 未完成
	resp, err := http.Post(url,
        "application/x-www-form-urlencoded",
        strings.NewReader("name=hasaki"))
    if err != nil {
        log.Println("--->http post error : ",err)
    }
 
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Println("--->translate post respone error : ",err)
		return "",err
    }
 
    return string(body),nil
}

func PostFile(uri string, params map[string]string, paramName, path string) (*http.Request, error) {
    // function : 上传单个文件到服务器上
    // param url : 服务器地址
    // param param : form参数
    // param paramName : 服务器上指定的键值,如果服务器上对不上这个名称,服务器会报500
    // param path : 本地文件的路径
    // example
    // path := "D:/pratice/hasakiPic/Mimipigeon/0.jpg"
    // extraParams := map[string]string{
    //    "title":       "My Document",
    // }
    // request, err := newfileUploadRequest("http://127.0.0.1:8080/uploadFile", extraParams, "file", path)
    // if err != nil {
    //    log.Println(err)
    // }
    file, err := os.Open(path)
    if err != nil {
        return nil, err
    }
    defer file.Close()
 
    body := &bytes.Buffer{}
    writer := multipart.NewWriter(body)
    part, err := writer.CreateFormFile(paramName, filepath.Base(path))
    if err != nil {
        return nil, err
    }
    _, err = io.Copy(part, file)
 
    for key, val := range params {
        _ = writer.WriteField(key, val)
    }
    err = writer.Close()
    if err != nil {
        return nil, err
    }
 
    request, err := http.NewRequest("POST", uri, body)
    request.Header.Add("Content-Type", writer.FormDataContentType())
    return request, err
}

func RequestStatusCheck(status string,code string)bool{
	// http请求返回状态码检查
	if StrInStrings(code,status){
		return true
	}else{
		return false
	}
}

func SaveFileFromNet(url string,savePath string){
	// function : 保存网络文件到本地
	// param savePath : 保存在本地路径  xxx/xxx.jpg
	// param url : link of file
    res, err := http.Get(url)
    if err != nil {
        log.Println("common function save file from Net error")
        return
	}
	if strings.Index(res.Status,"200")==-1{
		log.Println("save file from net function return status code : ",res.Status)
		return
	}
    defer res.Body.Close()
    // 获得get请求响应的reader对象 Note : 这里有文件大小的限制
    reader := bufio.NewReaderSize(res.Body, 1024 * 1024)
    
    file, err := os.Create(savePath)
    if err != nil {
        panic(err)
    }
    // 获得文件的writer对象
    writer := bufio.NewWriter(file)
    io.Copy(writer, reader)
}

func SavePic(url string,savePath string){
	// function : 保存图片到本地
	// param savePath : 图片保存路径  xxx/xxx.jpg
	// param url : 图片网上的地址
    imgPath := savePath
    imgUrl := url
    
    res, err := http.Get(imgUrl)
    if err != nil {
        fmt.Println("common function save picture error")
        return
	}
	if strings.Index(res.Status,"200")==-1{
		fmt.Println("save pictrue function return status code : ",res.Status)
		return
	}
    defer res.Body.Close()
    // 获得get请求响应的reader对象
    reader := bufio.NewReaderSize(res.Body, 64 * 1024)
    
    file, err := os.Create(imgPath)
    if err != nil {
        panic(err)
    }
    // 获得文件的writer对象
    writer := bufio.NewWriter(file)
    io.Copy(writer, reader)
}

func LocalIPv4s() ([]string, error) {
	var ips []string
	addrs, err := net.InterfaceAddrs()
	if err != nil {
		return ips, err
	}

	for _, a := range addrs {
		if ipnet, ok := a.(*net.IPNet); ok && !ipnet.IP.IsLoopback() && ipnet.IP.To4() != nil {
			ips = append(ips, ipnet.IP.String())
		}
	}

	return ips, nil
}

func LocalIP() string {
	// example :
	// ip := ipv4.LocalIP()
	// fmt.Println(ip)
	// ips, _ := ipv4.LocalIPv4s()
	// fmt.Println(ips)
	ips, _ := LocalIPv4s()
	return ips[0]
}

/*-----------------------------路径相关----------------------------*/
func ExePath()string{
	// function : 返回golang二进制文件的启动位置,golang代码打包之后,这个就会
	// 返回当前程序的路径,如果是通过go run 来运行则会返回一个临时启动的执行路径
	// example : if D:\xxx\abc.exe  result->  D:\xxx
	dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
	if err!=nil{
		PrintError(err)
		return ""
	}
	return dir
}

/*-----------------------------定制日志----------------------------*/
func Logging(module string,content string,logFile string){
	// function : 记录普通级别的信息
	// param module : trace/info/warning/error
	// param logFile : 需要写入到文件的路径
	switch module{
	case "trace":
		trace:=log.New(ioutil.Discard,"trace :",log.Ldate|log.Ltime|log.Lshortfile)
		trace.Println(content)
		break
	case "info":
		info:=log.New(os.Stdout,"info :",log.Ldate|log.Ltime|log.Lshortfile)
		info.Println(content)
		break
	case "warning":
		warning:=log.New(os.Stdout,"warning :",log.Ldate|log.Ltime|log.Lshortfile)
		warning.Println(content)
		break
	case "error":
		// 如果用户传过来的地址是个空值的情况就直接打印内容即可
		if len(logFile)<2{
			print(content)
			return
		}
		file,err:=os.OpenFile(logFile,os.O_CREATE|os.O_WRONLY|os.O_APPEND,0666)
		if err!=nil{
			log.Fatalln("common.go logging function failed to open error log file:",err)
		}
		err2:=log.New(io.MultiWriter(file,os.Stderr),"error :",log.Ldate|log.Ltime|log.Lshortfile)
		err2.Println(content)
		break
	default:
		return
	}
}

//---------------------------- 打印相关 ------------------------------------
func Print(content interface{}){
	// function : 简化打印
	fmt.Println(content)
}

func Debug(msg ...string){
    // 带有时间的打印
    log.Println(msg)
}

func PrintError(content error){
	// function : 错误提示
	panic(content)
}

func PrintLocal(content string){
	// function : 写入日志到本地txt文件,日志文件的路径默认在执行文件的同一目录
	dir:=ExePath()
	if len(dir)<2{
		return
	}
	err:=Mkdir(dir+"/log")
	if err!=nil{
		fmt.Println(err)
	}
}

func DateJudge(firstDate string,lastDate string)(bool){
	/*
	function : 判断前后时间是否一致,如果一致则返回真,否则假
	param firstDate : 第一个时间 格式:2019-12-21 20:05
	param lastDate : 第二个时间
	return : 如果一致则返回真,否则假
	*/
	if firstDate==lastDate{
		return true
	}else{
		return false
	}
}
/* ------------------------------ 字符串处理 ------------------------------ */
func StrInStrings(str string,totalString string) bool{
	// 判断一串字符是否在另外一串字符之间
	// param str : 需要判断的字符
	// param totalString : 顾名思义,完整的字符串
	// return : 如果存在则返回true,否则就返回false
	if strings.Index(totalString,str)!=-1{
		// 如果字符串包含则返回非-1整型索引,如果不包含则返回-1
		return true
	}else{
		return false
	}
}

func StrJoin(first string,last string,mid string)(string){
	/*
	function : 拼接合成字符串
	param first : 第一段字符串
	param mid : 中间分割的字符串
	param last : 最后一段字符串
	return : 返回拼接好的字符串
	*/
	return strings.Join([]string{first,last},mid)
}

func StringsJoin(stringList []string , mid string)string{
	// 把一个字符串列表合成有一个字符串,字符串的分割就用mid
	return strings.Join(stringList,mid)
}

func StringsReplace(originStrings string,targetStrings string,replaceSrtings string)string{
	// 字符串替换
	// origin : 原始数据
	// target : 需要被替换的数据
	// replace : 插入字符
	result := strings.Replace(originStrings,targetStrings,replaceSrtings,-1)
	return result
}

/*----------------------------------文件操作--------------------------------*/
func FileExist(path string) bool {
	// 判断文件是否存在
	_, err := os.Lstat(path)
	return !os.IsNotExist(err)
}

func FileSize(filePath string) int64 {
	// 获取文件的大小
	fi,err:=os.Stat(filePath)
	if err!=nil{
		log.Println("common package FileSize function err : ",err)
	}
	return fi.Size()
}

func GetFileNameFromAbsPath(absPath string)string{
    // 从绝对路径中获取文件名
    // abs path example : \\\\192.168.89.200/research/Research/Hasaki/automatedScriptError/hasakiTest.txt
	// return hasakiTest.txt
    fi,err:=os.Stat(absPath)
	if err!=nil{
		log.Println("common package GetFileNameFromAbsPath function err : ",err)
	}
	return fi.Name()
}

func MakeDir(dirPath string){
	// 创建目录
	err:=os.Mkdir(dirPath,os.ModePerm)
	if err!=nil{
		log.Println(err)
	}
}

func CreateFile(filePath string){
	// 创建一个新的文件
	_, err := os.Create(filePath) //创建文件
	if err != nil {
		log.Println("common package createFile function err : ",err)
	}
}

func DeleteFile(filePath string){
	// 删除指定的文件
	err := os.Remove(filePath)
	if err!=nil{
		log.Println("common package delete file err : ",err)
	}
}

func DeleteDir(dir string){
	// 删除整个目录
	err:=os.RemoveAll(dir)
	if err!=nil{
		log.Println("common package delete dir err : ",err)
	}
}

func ReadTxt(path string) []string {
	// 返回txt文件的所有文本数据
	var emptyList []string
	f, err1 := os.Open(path)
	if err1!=nil{
		log.Println("common file -> ReadTxt function err1->",err1)
		return emptyList
	}
	defer f.Close()
	// 一次性读取全部文本数据
	var b = make([]byte, 4096)
	_, err2 := f.Read(b)
	if err2 != nil {
		log.Println("common file -> ReadTxt function err2->",err2)
		return emptyList
	}

	l := strings.Split(string(b), "\r\n")
	return l
}

func ReadJson(path string)(map[string]interface{}){
	/*
	function : 读取json文件并转换成[]map类型
	param path : 需要读取的json文件的路径
	return : 返回
	*/
	byteValue, err := ioutil.ReadFile(path)
	if err!=nil{
		fmt.Println("读取json文件报错,读取的文件地址:",path)
	}

	var result map[string]interface{}
	err = json.Unmarshal(byteValue, &result)
	if err != nil {
		fmt.Println("解析json 错误",err)
	}
	
	return result
}

func WriteJson(path string,mapData interface{}){
	// function : 写入json 文件
	// param mapData : map类型数据
	if jsonData,err:=json.Marshal(mapData);err==nil{
		err := ioutil.WriteFile(path, jsonData, 0644)
		fmt.Println("写入json",err)
	}else{
		fmt.Println("结果错误",err)
	}
}

func ReadJsonForList(path string)([]map[string]interface{}){
	/*
	function : 读取json文件并转换成map类型
	param path : 需要读取的json文件的路径
	return : 返回[]类型的json
	*/
	byteValue, err := ioutil.ReadFile(path)
	if err!=nil{
		log.Println("读取json文件报错,读取的文件地址:",path)
	}

	var result []map[string]interface{}
	
	err = json.Unmarshal(byteValue, &result)
	if err != nil {
		log.Println("解析json 错误",err)
		emptyList:=result
		return emptyList
	}
	
	return result
}

func ReadCSV(path string)[][]string{
	// function : 从本地加载CSV文件,并返回到上层,读取csv
	// 注意到,读取csv的数据是[][]string类型
	// param path : CSV文件路径
	var tampData [][]string
	f, err := os.Open(path)
	if err != nil{
		log.Println("Read CSV Function Open File Error: ", err)
		return tampData
	}
	 
	reader := csv.NewReader(f)
	
	// 可以一次性读完
	csvList, err := reader.ReadAll()
	if err != nil{
		log.Println("Read CSV Function Read All Error: ", err)
		return tampData
	}
	
	return csvList
}

func Mkdir(filePath string)error{
	// function : 创建文件夹
	// param filePath : 文件夹路径
	err:=os.Mkdir(filePath,os.ModePerm)
	return err
}

func GetAllFile(pathname string) ([]string,error) {
	// 获取一个目录下所有的文件
	var nameList []string
	rd, err := ioutil.ReadDir(pathname)
	for _, fi := range rd {
		nameList=append(nameList,fi.Name())
	}
	return nameList,err
}

func Unzip(zipFile string, destDir string) error {
	// 压缩文件
	// param zipFile : 需要压缩的文件夹 xxx/abc.zip
	// param destDir : 压缩之后的路径 xxx/abc   unzip file --> xxx/abc/abc 
    zipReader, err := zip.OpenReader(zipFile)
    if err != nil {
        return err
    }
    defer zipReader.Close()

    for _, f := range zipReader.File {
        fpath := filepath.Join(destDir, f.Name)
        if f.FileInfo().IsDir() {
            os.MkdirAll(fpath, os.ModePerm)
        } else {
            if err = os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil {
                return err
            }

            inFile, err := f.Open()
            if err != nil {
                return err
            }
            defer inFile.Close()

            outFile, err := os.OpenFile(fpath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
            if err != nil {
                return err
            }
            defer outFile.Close()

            _, err = io.Copy(outFile, inFile)
            if err != nil {
                return err
            }
        }
    }
    return nil
}

func MoveFile(oldFile string,newFile string){
	// 剪切文件到新的地方
	err := os.Rename(oldFile, newFile)
	if err!=nil{
		log.Println("common function Move File Error : ",err)
	}
}

func CopyFile(oldFile, destFile string) {
	// 文件复制
	originalFile, err := os.Open(oldFile)   // 打开原始文件
	if err != nil {
		log.Fatal(err)
	}
	defer originalFile.Close()
	
	newFile, err := os.Create(destFile)    // 创建新的文件作为目标文件
	if err != nil {
		log.Fatal(err)
	}
	defer newFile.Close()
	
	_, err = io.Copy(newFile, originalFile)   // 从源中复制字节到目标文件
	if err != nil {
		log.Fatal(err)
	}
}

/* ----------------------------时间相关的操作----------------------*/
func Sleep(n int){
	/*
	function : 睡眠函数
	param n : 睡眠的秒数
	秒:time.Second
	分钟:time.Minute
	小时:time.Hour
	微妙:time.Nanosecond
	*/
	if n<0{
		return
	}

	for i:=0;i<=n;i++{
		time.Sleep(time.Second)
	}
}

func SleepMin(n int){
	// function : 睡眠多少分钟
	// param n : 睡眠的分钟数
	if n<0{
		return
	}
	for i:=0;i<=n;i++{
		time.Sleep(time.Minute)
	}
}

func SleepHour(h int){
	// function : 睡眠的小时数
	if h<0{
		return
	}
	for i:=0;i "3","2","1"
    for i:=0; i < int(len(l)/2) ;i++{
        li := len(l) - i -1
        l[i],l[li] = l[li],l[i]
    }
}

func CalculateArrayLengh(targetList []string) string{
	// 计算数组长度
	var lengh int = len(targetList)
	return strconv.Itoa(lengh)
}

/*--------------------------------数学相关-------------------------------*/
func Min(a, b int) int {
	// function : 判断两个整型的大小
	if a <= b {
		return a
	}
	return b
}

func Max(a, b int) int {
	// function : 判断两个整型的大小
	if a >= b {
		return a
	}
	return b
}

/*--------------------------------类型转换-------------------------------*/
func Type(data interface{}){
	// 检查数据类型
	log.Println("Type of the data : ",reflect.TypeOf(data))
}

func IntToStr(num int)(string){
	/*
	function : 整型转换成字符串
	param num : 整型
	return : ...
	*/
	return strconv.Itoa(num)
}

func StructToJson(s interface{})string{
	// function : 结构体转json字符串
	// return : 返回json字符串
	var data string
	if dataU,err:=json.MarshalIndent(s,"","    ");err==nil{
		// fmt.Println(fmt.Sprintf("%T",dataU)) []uint8
		data=string(dataU)
	}else{
		fmt.Println("结构体转json结果错误",err)
	}
	return data
}

func Float64ToInt(f float64)int{
	// function : float64转int
	return int(math.Floor(f))
}

func Uint8ToStr(uint8Data []uint8) string {
	// function : uint8转字符串
	return string(uint8Data)
}

func JsonToMap(jsonStr string) map[string]interface{}{
	// function : json转map
	var returnData map[string]interface{}
	err:=json.Unmarshal([]byte(jsonStr),&returnData)
	if err!=nil{
		fmt.Println("json转map报错",jsonStr,"错误原因:",err)
	}
	return returnData
}

func Uint8ToMap(uint8Data []uint8) interface{}{
	// uint8转map
	var returnData map[string]interface{}
	err:=json.Unmarshal(uint8Data,&returnData)
	if err!=nil{
		fmt.Println("uint8转map",uint8Data,err)
	}
	return returnData
}

func MapToByte(mapData map[string]interface{}) []byte {
	// function : map 转 byte数组
	mJson,_:=json.Marshal(mapData)
	mJsonStr:=string(mJson)
	mByte:=[]byte(mJsonStr)
	return mByte
}

/* --------------------- 字符串处理 --------------------------*/
func DeleteBlank(str string)string{
	// 删除字符串中的空格
	str = DeteleStrInStr(str," ")
	return str
}

func DeteleStrInStr(str string,dstr string)string{
	// 删除字符串中指定的字符
	str = strings.Replace(str, dstr, "", -1)
	return str
}

你可能感兴趣的:(随笔)