golang中的map

golang中map学习

哈希表

哈希表是一个无序的key/value对的集合,其中所有的key都是不同的,然后通过给定的key可以在常数时间复杂度内检索、更新或删除对应的value;

golang中的map

在Go语言中,一个map就是一个哈希表的引用,map类型可以写为map[K]V,其中K和V分别对应key和value。map中所有的key都有相同的类型,所有的value也有着相同的类型,但是key和value之间可以是不同的数据类型。

……

阅读全文

WordPress搬家

WordPress搬家

主要采坑过程如下:

  1. 复制之前的php目录到目标新机器

  2. 在新机器上面安装openresty(nginx),

  3. apt install php7.2-fpm php7.2-mysql php7.2-curl php7.2-json php7.2-mbstring php7.2-xml php7.2-intl,安装php服务

  4. apt-get install mysql-server 安装数据库

  5. 查看php服务,service php7.2-fpm status

  6. 目录下/etc/php/7.2/fpm/pool.d,www.conf中将listen改为9000

  7. mysql轻量数据库迁移:

    ……

阅读全文

go解决leetcode-242

解决思路:使用map来解决问题;

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package main

import (
	"fmt"
	"reflect"
)

func isAnagram(s string, t string) bool {
	// var m1 map[string]int
	// var m2 map[string]int
	//map申明后默认是nil,得用make进行实例化
	m1 := make(map[string]int)
	m2 := make(map[string]int)

	for _, i := range s {
		m1[string(i)]++
	}
	for _, j := range t {
		m2[string(j)]++
	}
	return reflect.DeepEqual(m1, m2)
	//map不能直接用“==”进行比较

}

func main() {
	s := "hello"
	t := "lelho"
	// isAnagram(s, t)
	fmt.Println(isAnagram(s, t))

}

自己实现map比较函数equal,如下:

……

阅读全文

git常用操作

1、git使用的常规操作

git pull——>编辑——>git add——>git commit——>git push

  1. 用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
  2. 用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支;
  3. 用git push 提交到远程的仓库。

其实就是工作区——git add——>暂存区——git commit——>HEAD

……

阅读全文

go实现单链表反转

单链表核心代码如下:

1.迭代方法:

1
2
3
4
5
6
7
8
func reverseList(node *ListNode) *ListNode {
	cur := node
	var pre *ListNode
	for cur != nil {
		cur.Next, pre, cur = pre, cur, cur.Next
	}
	return pre
}

理解:cur指向当前节点,pre是前节点初始为nil,反转过程:

1
2
3
4
next := cur.next //新建一个临时节点用于保存cur.next,不然会丢失
cur.next = pre
pre = cur
cur = next

2.递归方式

……

阅读全文

go实现选择排序

选择排序:对于给定的一组记录,经过第一轮比较之后得到最小记录,然后将该记录与第一个记录的位置进行交换;接着对对不包括第一个记录以外的其他记录进行第二轮比较,得到的最小记录与第二个记录进行位置交换;重复该过程,直到进行比较的记录只有一个为止。

具体实现如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package main

import "fmt"

func SelectSort(data []int) {
	length := len(data)
	for i := 0; i < length; i++ {
		tmp := data[i]
		flag := i
		for j := i + 1; j < length; j++ {
			if data[j] < tmp {
				tmp = data[j]
				flag = j
			}
		}

		if flag != i {
			data[flag] = data[i]
			data[i] = tmp
		}
		fmt.Println(data) //为了看具体排序的过程

	}
}

func main() {
	data := []int{44, 38, 65, 97, 76, 14, 27, 48}
	SelectSort(data)
	fmt.Println(data)
}

输出结果如下:

……

阅读全文

go语言中使用defer、panic、recover处理异常

go语言中的异常处理,没有try…catch等,而是使用defer、panic、recover来处理异常。

知识点:defer、panic、recover,异常处理

1、首先,panic 是用来表示非常严重的不可恢复的错误的。在Go语言中这是一个内置函数,如果在程序中遇到异常,或者调用panic函数,程序会立即退出(除非recover)。如下代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
package main

import "fmt"

func main() {
	a := 10
	b := 0
	c := a / b

	fmt.Println(c)
}

程序的输出如下:

……

阅读全文

goroute应用-模拟远程调用RPC

在本例中,使用通道代替socket实现RPC过程,客户端和服务器运行在同一个进程,服务器和客户端在两个goroute中。

应用知识:goroute,select,RPC过程

1、客户端请求和接收封装

下面的代码封装了向服务器请求数据,等待服务器返回数据,如果请求方超时,利用select,该函数还会处理超时逻辑。如下:

1
2
3
4
5
6
7
8
9
func RPCClient(ch chan string, req string) (string, error) {
	ch <- req
	select {
	case ack := <-ch:
		return ack, nil
	case <-time.After(time.Second):
		return "", errors.New("Time out")
	}
}

2、服务器接收和反馈数据

服务器接收到客户端的任意数据后,先打印再通过通道返回给客户端一个固定的字符串(hello),表示服务器已经收到请求。

……

阅读全文