Spring Boot 入门之基础篇

世界上最好的官方教程:https://docs.spring.io/spring-boot/docs/1.5.8.RELEASE/reference/html/index.html
中文版本:https://blog.csdn.net/qq_36348557/article/details/69396589
maven全局配置文件settings.xml详解:https://blog.csdn.net/u012225679/article/details/73740785
https://www.extlight.com/2017/11/23/Spring-Boot-%E5%85%A5%E9%97%A8%E4%B9%8B%E5%9F%BA%E7%A1%80%E7%AF%87%EF%BC%88%E4%B8%80%EF%BC%89/

https://www.cnblogs.com/zengkefu/p/5742617.html

部署项目教程参考:https://blog.csdn.net/taoshujian/article/details/75570780

Linux下对进程通信管理的信号机制概述

今天看到了篇使用golang实现的系统无感重启的文章,https://gravitational.com/blog/golang-ssh-bastion-graceful-restarts/,一般用来平滑处理一些系统服务,避免先停止再启用导致的服务不可用的情况。其中用到了信号机制,这里找了一些文章主要有来介绍这方面的文章,以便加深理解。https://blog.csdn.net/junyucsdn/article/details/50519248

https://blog.csdn.net/tiany524/article/details/17048069

https://my.oschina.net/chenliang165/blog/125825

Java中List和ArrayList、LinkedList的区别(转)

List 是接口,ArrayList和LinkedList是List的实现类。

List:是一个有序的集合,可以包含重复的元素。提供了按索引访问的方式。它继承 Collection。
List有两个重要的实现类:ArrayList 和 LinkedList
ArrayList:我们可以将其看作是能够自动增长容量的数组。
利用ArrayList的toArray()返回一个数组。
Arrays.asList()返回一个列表。
1.ArrayList底层采用数组实现,当使用不带参数的构造方法生成ArrayList对象时,实际上会在底层生成一个长度为10的Object类型数组。
2.如果增加的元素个数超过了10个,那么ArrayList底层会新生成一个数组,长度为原数组的1.5倍+1,然后将原数组的内容复制到新数组当中,并且后续增加的内容都会放到新数组当中。当新数组无法容纳增加的元素时,重复该过程。
3.对于ArrayList元素的删除操作,需要将被删除元素的后续元素向前移动,代价比较高。
4.集合当中只能放置对象的引用,无法放置原生数据类型,我们需要使用原生数据类型的包装类才能加入到集合当中。
5.集合当中放置的都是Object类型,因此取出来的也是Object类型,那么必须要使用强制类型转换将其转换为真正的类型(放置进去的类型)。

===========================

ArrayList的内部实现是基于内部数组Object[],所以从概念上讲,它更象数组,但LinkedList的内部实现是基于一组连接的记录,所以,它更象一个链表结构,所以,它们在性能上有很大的差别:
ArrayList: 从上面的分析可知,在ArrayList的前面或中间插入数据时,你必须将其后的所有数据相应的后移,这样必然要花费较多时间,所以,当你的操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;

LinkedList: 而访问链表中的某个元素时,就必须从链表的一端开始沿着连接方向一个一个元素地去查找,直到找到所需的元素为止,所以,当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。

Go中slice作为参数传递的一些“坑”

https://juejin.im/post/5a9f543a6fb9a028cb2d2b91

看明白了上面的文章,下面的例子基本也就明白了

 

package main

import "fmt"

func main() {
	a := []int{1,2,3}
	abc(a)
	fmt.Println(a)
}
func abc(a []int) {
	a[0] = 2 //修改后还是原来的a
	a = append(a, 4) // 此a非原a,使用append导致了重新分配内存地址(存储空间不足,系统自动分配一块新的足够大的内存地址,此时a的物理内存地址已经发行了变化,并将原来a的值copy一份到新的内存地址,所以这里修改的只是新内存地址的值,原来内存地址的值并没有改变),试着删除这行运行一次再看结果
	fmt.Println(a)
	
	a[0] = 7 // 新a,因为上面执行了append
	fmt.Println(a)
	
	fmt.Printf("\n===\n")
}

解释:

golang中string rune byte 三者的关系

在Golang中 string 底层是用byte字节数组存储的,并且是不可以修改的。

例如

s:="Go编程"
fmt.Println(len(s)) //输出结果应该是8因为中文字符是用3个字节存的(2+3*2=8)。
fmt.Printf("%d", len(string(rune('编')))) //经测试一个汉字确实占用3个字节,所以结果是3

如果想要获得字符个数的话,需要先转换为rune切片再使用内置的len函数

fmt.Println(len([]rune(s))) // 结果就是4了。

所以用string存储unicode的话,如果有中文,按下标是访问不到的,因为你只能得到一个byte。 要想访问中文的话,还是要用rune切片,这样就能按下表访问。

总结:
rune 能操作任何字符
byte 不支持中文的操作

示例:https://blog.haohtml.com/archives/14903