排序(sort)
package main
import (
"fmt"
"sort"
)
type Sort struct {
m []int
}
func (s Sort) Len() int {
return len(s.m)
}
// 表示使用什么标准进行排序
func (s Sort) Less(i int, j int) bool {
return s.m[i] > s.m[j]
}
func (s Sort) Swap(i, j int) {
s.m[i], s.m[j] = s.m[j], s.m[i]
}
func main() {
// 都是升序
sint := []int{3,52,532,51,2}
sort.Ints(sint)
sfloat := []float64{3,52.4,532,52.1,2}
sort.Float64s(sfloat)
strings := []string{"dqfq", "klej", "dwqh", "aaa", "中国", "bbb"}
sort.Strings(strings)
s := []int{3,521,532,52,2, 52}
sort.Ints(s)
// 二分查找
index := sort.Search(len(s), func(i int) bool {
return s[i] == 53
})
fmt.Println(s, index)
s1 := Sort{m: []int{3,52,532,51,2}}
sort.Sort(s1)
fmt.Println(s1)
}
文件操作(os、io)
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
// file 是文件的地址
var file, err = os.Open("content.text")
fmt.Println(file)
if err != nil {
fmt.Println(err)
}
defer file.Close() // 关闭文件句柄
if err != nil {
fmt.Println(err)
}
// 缓冲读取
reader := bufio.NewReader(file)
for {
str, err := reader.ReadString('\n') // 读到换行就结束
if err == io.EOF { // io.EOF表示文件末尾
break
}
fmt.Printf("%v", str)
}
}
小容量文件读取
package main
import (
"fmt"
"io/ioutil"
)
func main() {
content, errs := ioutil.ReadFile("content.text")
if errs != nil {
fmt.Println(errs)
}
fmt.Println(string(content))
}
写入文件
const (
// Exactly one of O_RDONLY, O_WRONLY, or O_RDWR must be specified.
O_RDONLY int = syscall.O_RDONLY // open the file read-only. 只读
O_WRONLY int = syscall.O_WRONLY // open the file write-only. 只写
O_RDWR int = syscall.O_RDWR // open the file read-write. 读写
// The remaining values may be or'ed in to control behavior.
O_APPEND int = syscall.O_APPEND // append data to the file when writing. 追加
O_CREATE int = syscall.O_CREAT // create a new file if none exists. 创建
O_EXCL int = syscall.O_EXCL // used with O_CREATE, file must not exist. 文件是否存在
O_SYNC int = syscall.O_SYNC // open for synchronous I/O. 同步IO
O_TRUNC int = syscall.O_TRUNC // truncate regular writable file when opened. 如果可能,清空文件
)
package main
import (
"fmt"
"os"
"bufio"
)
func main() {
file, err := os.OpenFile("hello.log", os.O_RDWR | os.O_APPEND | os.O_CREATE, 0666)
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
str := "world \n"
writer := bufio.NewWriter(file) // 写入缓冲
for i := 1; i <= 5; i++ {
//n1, _ := file.WriteString(str) // 直接写入文件
n1, _ := writer.WriteString(str)
fmt.Println(n1)
}
writer.Flush() // 缓冲写入文件
}
Json
序列化
package main
import (
"encoding/json"
"fmt"
)
type Student struct {
Name string `json:"my_name"` // 反射机制,{"my_name":"Sam","my_age":18,"my_height":182}
Age int `json:"my_age"`
Height int `json:"my_height"`
}
func main() {
// 构造体转json
stu := Student{"Sam", 18, 182}
data, err := json.Marshal(&stu)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(data))
// 集合转json
m := make(map[string]string)
m["name"] = "Sam"
m["age"] = "18"
data, err := json.Marshal(m)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(data))
// 切片转json
s := make([]int, 4)
for i, _ := range s {
s[i] = rand.Intn(100)
}
data, err := json.Marshal(s)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(data))
}
反序列化
package main
import (
"encoding/json"
"fmt"
)
type Student struct {
Name string `json:"my_name"` // 反射机制,{"my_name":"Sam","my_age":18,"my_height":182}
Age int `json:"my_age"`
Height int `json:"my_height"`
}
func main(){
// 需要注意结构体是否反射
str := "{\"my_name\":\"Sam\",\"my_age\":18,\"my_height\":182}"
var p Student
err := json.Unmarshal([]byte(str), &p)
if err != nil {
fmt.Println(err)
}
fmt.Println(p, p.Age)
// 集合
m := make(map[string]string)
str := "{\"age\":\"18\",\"name\":\"Sam\"}"
err := json.Unmarshal([]byte(str), &m)
if err != nil {
fmt.Println(err)
}
fmt.Printf("%v \n", m)
// 切片
s := make([]string ,4)
str := "[\"sam\",\"18\"]"
err := json.Unmarshal([]byte(str), &s)
if err != nil {
fmt.Println(err)
}
fmt.Println(s[0])
}
时间(time)
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now() // 返回Time构造体
fmt.Printf("%T, %v \n", now, now)
fmt.Println(now.Year()) // 年
fmt.Printf("%T, %v \n", now.Month(), now.Month()) // 月
fmt.Println(int(now.Month())) // 月
fmt.Println(now.Day()) // 日
fmt.Println(now.Hour()) // 时
fmt.Println(now.Minute()) // 分
fmt.Println(now.Second()) // 秒
y, m, d := now.Date() // 同时获取年月日
fmt.Println(y,int(m),d)
date := fmt.Sprintf("%d-%d-%d %d:%d:%d \n", now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second())
fmt.Println(date)
fmt.Printf("%v \n", now.Format("2020/09/15 13:42:00"))
fmt.Println(now.Unix()) // 时间戳
fmt.Println(now.UnixNano()) // 毫秒
}
字符串(strings)
package main
import (
"fmt"
"strings"
)
func main() {
var str = "!!!hello,中国,中文!!!"
fmt.Println(strings.Count(str, "l")) // strings.Count(str, substr) 统计子字符串出现的次数
fmt.Println(strings.EqualFold("abc", "ABC")) // strings.EqualFold(str1, str2) 不区分大小写,对比字符是否相等
fmt.Println(strings.Index(str, "中")) //strings.Index(str, substr) 返回子字符串第一次出现的索引位置
fmt.Println(strings.LastIndex(str, "中文")) // strings.LastIndex(str, substr) 返回子字符串最后一次出现的索引位置
fmt.Println(strings.Replace(str, "中文", "你好", 15)) // strings.Replace(str, old, new, index) 子字符串替换 index = -1 表示全部替换
fmt.Println(strings.Split(str, ",")) // strings.Split(str, substr) 根据子字符串切割,返回数组
fmt.Println(strings.ToUpper(str)) // strings.ToUpper(str) 英文字母转大写
str = strings.ToUpper(str)
fmt.Println(strings.ToLower(str)) // strings.ToLower(str) 英文字母转小写
str = strings.ToLower(str)
fmt.Println(strings.TrimSpace(str)) // strings.TrimSpace(str) 剔除字符串两边的空格
fmt.Println(strings.Trim(str, "!")) // strings.Trim(str, cutstr) 剔除两边指定字符串
fmt.Println(strings.TrimLeft(str, "!")) // strings.TrimLeft(str, cutstr) 剔除左边指定字符串
fmt.Println(strings.TrimRight(str, "!")) // strings.TrimRight(str, cutstr) 剔除右边指定字符串
fmt.Println(strings.HasPrefix(str, "!")) // strings.HasPrefix(str, prefix) 验证字符串是否以指定字符串开头
fmt.Println(strings.HasSuffix(str, "!")) // strings.HasSuffix(str, suffix) 验证字符串是否以指定字符串结尾
}
Redis
redigo
- 安装
go get github.com/garyburd/redigo/redis
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
func main() {
//conn, err := redis.Dial("tcp", "127.0.0.1:6379")
conn, err := redis.DialURL("redis://127.0.0.1:6379")
if err != nil {
fmt.Println("conn err =", err)
return
}
defer conn.Close()
// key-value 键值对
rs, err := conn.Do("Setex", "name", 1, "Sam")
if err != nil {
fmt.Println("set err = ", err)
return
}
fmt.Println(rs) // ok
rs, err = conn.Do("Get", "name") // 返回接口,断言byte切片
if err != nil {
fmt.Println("get err = ", err)
return
}
if rs == nil {
fmt.Println("数据失效")
return
}
fmt.Println(string(rs.([]byte)))
conn.Send("Get", "name")
conn.Flush()
rs, err = conn.Receive()
if err != nil {
fmt.Println("get err = ", err)
return
}
if rs == nil {
fmt.Println("数据失效")
return
}
fmt.Println(string(rs.([]byte)))
// list 列表
conn.Do("Lpush", "testlist", "Sam")
conn.Do("Lpush", "testlist", "Kobe")
conn.Do("Lpush", "testlist", "Alen")
// 获取列表长度
llen, _ := redis.Int(conn.Do("llen", "testlist"))
rs, _ = redis.Values(conn.Do("lrange", "testlist", 0, llen))
for _, v := range rs {
fmt.Println(string(v.([]byte)))
}
// hash 哈希表
conn.Do("hset", "test_hash", "height", 180)
rs, _ = redis.Strings(conn.Do("hgetall", "test_hash"))
for k, v := range rs {
fmt.Println(k, v)
}
}
其他
切片去重
func RemoveRepElement(res, oldData interface{}) {
temp := map[string]struct{}{}
newValue := reflect.ValueOf(res)
if newValue.Kind() != reflect.Ptr {
panic("类型不是指针")
}
oldValue := reflect.ValueOf(oldData)
if oldValue.Kind() != reflect.Slice {
panic("类型不是切片")
}
direct := reflect.Indirect(newValue)
newType := reflect.TypeOf(res).Elem()
for i := 0; i < oldValue.Len(); i++ {
if newType.Elem().Kind() != oldValue.Index(i).Kind() {
panic("类型错误")
}
key := fmt.Sprint(oldValue.Index(i))
if _, ok := temp[key]; !ok {
temp[key] = struct{}{}
direct.Set(reflect.Append(direct, oldValue.Index(i)))
}
}
}
- 本文链接:http://codersam.cn/2020/09/23/Go%E5%90%84%E7%A7%8D%E5%8C%85%E7%9A%84%E4%BD%BF%E7%94%A8%E5%8F%8A%E5%B0%8F%E6%8A%80%E5%B7%A7/
- 版权声明:本博客所有文章除特别声明外,均默认采用 许可协议。