大佬们自行绕过,本人萌新,随着工作之余抽时间学习,持续补充ing...

  • defer栈,后入先出,后定义先调用
  • 形如go func(){}()的闭包协程调用,如果不传递参数,那么在闭包内使用闭包外部的变量,使用的是地址,跟随外部变化
  • 函数调用时,根据所属结构体调用相应方法
  • 切片使用make初始化时,定义长度为3,那么未定义默认值的部分为0,再调用append追加元素,从第4个元素开始
  • 默认引用传递:slice、map、channel
  • for循环中不会每次循环的时候都新建循环变量,所以循环内赋值和取地址,应定义临时变量,而不应使用循环变量
  • interface变量使用前需要断言(判断和转换变量类型)
  • map的key如果不是整形有序的,range是随机遍历

 

int转string

data := 12
res := strconv.FormatInt(int64(data), 10)
res1 := strconv.Itoa(data)
fmt.Println( reflect.TypeOf(res) )
fmt.Println( reflect.TypeOf(res1) )

float转string

data := 12.12
res := strconv.FormatFloat(data, 'f', -1, 32)
fmt.Println( reflect.TypeOf(res) )
fmt.Println( res )

string转float

data := "12.12"
res, err := strconv.ParseFloat(data, 32)
if err != nil{
	panic(err)
}
fmt.Println( reflect.TypeOf(res) )
fmt.Println( res )

string转int

data := "12"
res, err := strconv.ParseInt(data, 10, 64)
res1, err := strconv.Atoi(data)
if err != nil{
	panic(err)
}
fmt.Println( reflect.TypeOf(res) )
fmt.Println( res )
fmt.Println( reflect.TypeOf(res1) )
fmt.Println( res1 )

不同位int之间转换

fmt.Println(reflect.TypeOf(int(12)))
fmt.Println(reflect.TypeOf(int8(12)))
fmt.Println(reflect.TypeOf(int32(12)))
fmt.Println(reflect.TypeOf(int32(12)))
fmt.Println(reflect.TypeOf(int64(12)))

除法保留小数

float64(113422)/float64(1000)

分割数组和连接字符串

str := "why/test"
fmt.Println( strings.Join(strings.Split(str, "/"), "-" ))

根据指定字符串查找目标字符串是否存在,存在的话前后切割数组

func substr(str string, target string, turn string, hasPos bool) string {
	pos := strings.Index(str, target)

	if pos == -1 {
		return ""
	}

	if turn == "left" {
		if hasPos == true{
			pos = pos + 1
		}
		return str[:pos]
	}else if turn == "right" {
		if hasPos == false{
			pos = pos + 1
		}
		return str[pos:]
	}else{
		panic("params 3 error")
	}
}

时间和时间戳

time.Now()  //包含时区的当前时间
time.Now().Unix()    //当前时间戳
time.Now().Format("2006-01-02 15:04:05")    //Y-m-d H:i:s

first := time.Now()
second := time.Now()
fmt.Println( second.Sub(first).Seconds() )    //时差ms

格式化保留2位小数

fmt.Printf("9.8249	=>	%0.2f(四舍)\n", 9.8249)
fmt.Printf("9.82671	=>	%0.2f(六入)\n", 9.82671)
fmt.Printf("9.8351	=>	%0.2f(五后非零就进一)\n", 9.8351)
fmt.Printf("9.82501	=>	%0.2f(五后非零就进一)\n", 9.82501)
fmt.Printf("9.8250	=>	%0.2f(五后为零看奇偶,五前为偶应舍去)\n", 9.8250)
fmt.Printf("9.8350	=>	%0.2f(五后为零看奇偶,五前为奇要进一)\n", 9.8350)  

9.8249  =>  9.82(四舍)
9.82671 =>  9.83(六入)
9.8351  =>  9.84(五后非零就进一)
9.82501 =>  9.83(五后非零就进一)
9.8250  =>  9.82(五后为零看奇偶,五前为偶应舍去)
9.8350  =>  9.84(五后为零看奇偶,五前为奇要进一)

口诀:四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一

解析url

    u, err:= url.Parse("http://www.why.com:8888/why/test?id=1")
	if err != nil{
		panic(err)
	}
	fmt.Println(u.Scheme)
	fmt.Println(u.Host)

	arr := strings.Split(u.Host, ":")
	fmt.Println(arr[0])
	fmt.Println(arr[1])

	fmt.Println(u.Port())
	fmt.Println(u.Path)
	fmt.Println(u.RawQuery)

	m, _ := url.ParseQuery(u.RawQuery)
	fmt.Println(m["id"])



http
www.why.com:8888
www.why.com
8888
8888
/why/test
id=1
[1]

根据时间检测目录,不存在则创建

​
func CreateDateDir(Path string) string {
	folderName := time.Now().Format("20060102")
	folderPath := filepath.Join(Path, folderName)
	if _, err := os.Stat(folderPath); os.IsNotExist(err) {
		// 必须分成两步:先创建文件夹、再修改权限
		os.Mkdir(folderPath, 0777) //0777也可以os.ModePerm
		os.Chmod(folderPath, 0777)
	}
	return folderPath
}

​

按照请求的path建日志文件

    u, err:= url.Parse("http://www.why.com:8888/why/test?id=1")
	if err != nil{
		panic(err)
	}

	pathArr := strings.Split(u.Path, "/")
	fileName := strings.Join(pathArr, "-")
	writePath := "/tmp/logs/2020-01-12"
	fileName = path.Join(writePath, fileName[1:len(fileName)] + ".log")

	fmt.Println(pathArr)
	fmt.Println(fileName)

文件写入

//使用io.WriteString()函数进行数据的写入,不存在则创建
func WriteWithIo(filePath, content string) {
	fileObj,err := os.OpenFile(filePath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0777)
	if err != nil {
		fmt.Println("Failed to open the file",err.Error())
		os.Exit(2)
	}
	if  _,err := io.WriteString(fileObj,content);err == nil {
		fmt.Println("Successful appending to the file with os.OpenFile and io.WriteString.",content)
	}
}


参数2:
os.O_WRONLY | os.O_CREATE | O_EXCL    【如果已经存在,则失败】
os.O_WRONLY | os.O_CREATE    【如果已经存在,会覆盖写,不会清空原来的文件,而是从头直接覆盖写】
os.O_WRONLY | os.O_CREATE | os.O_APPEND    【如果已经存在,则在尾部添加写】

断言

func assertion(data interface{}) interface{}  {
	switch data.(type) {
	case string:
		return data.(string)
	case int:
		return data.(int)
	case int8:
		return data.(int8)
	case int32:
		return data.(int32)
	case int64:
		return data.(int64)
	case float32:
		return data.(float32)
	case float64:
		return data.(float64)
	default:
		return data
	}
	return nil
}