Golang变量逃逸————堆、栈
变量逃逸——堆、栈变量逃逸——堆、栈堆(Heap)与栈(Stack)是开发人员必须面对的两个概念,在理解这两个概念时,需要放到具体的场景下,因为不同场景下,堆与栈代表不同的含义。一般情况下,有两层含义:(1)程序内存布局场景下,堆与栈表示两种内存管理方式;(2)数据结构场景下,堆与栈表示两种常用的数据结构。
1、程序内存分区中的堆与栈####### 1.1 栈简介栈只允许从线性表的同一端放入和取出数据,按照后进先出(LIFO)的顺序,如下图:
栈由操作系统自动分配释放,用于存放函数的参数值、局部变量等,其操作方式类似于数据结构中的栈。参考如下代码
int main() {
int b; //栈
char s[] = "abc"; //栈
char *p2; //栈
}
其中函数中定义的局部变量按照先后定义的顺序依次压入栈中,也就是说相邻变量的地址之间不会存在其它变量。栈的内存地址生长方向与堆相反,由高到底,所以后定义的变量地址低于先定义的变量,比如上面代码中变量 s 的地址小于变量 b 的地址,p2 地址小于 s 的地址。栈中存储的数据的生命周期 ...
Golang递归、匿名函数、作用域、闭包
递归、匿名函数、作用域、闭包简单来说,递归就是函数自己调自己。有2种方式,一种是只在在自己函数中调用自己,一种是间接在自己函数中调用的其他函数中调用了自己。
递归函数需要有边界条件、递归前进段、递归返回段
递归一定要有边界条件
当边界条件不满足时,递归前进
当边界条件满足时,递归返回
斐波那契数列Fibonacci number:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …如果设F(n)为该数列的第n项(
n∈N*),那么这句话可以写成如下形式:F(n)=F(n-1)+F(n-2) 有F(0)=0,F(1)=1,F(2)=1,F(n)=F(n-1)+F(n-2)
package main
import "fmt"
// 非递归版,循环版
func fib(n int) int {
switch {
case n < 0:
panic("n is negative")
case n == 0:
return 0
case n == 1 || n == 2 ...
Golang List
Listfunc printList(i string, l list.List) {
fmt.Println(i)
fmt.Printf("类型:%T 值:%v 长度:%d \n", l, l, l.Len())
}
func printIterateList(l list.List) {
for e := l.Front(); e != nil; e = e.Next() {
fmt.Printf("%T, %v \n", e.Value, e.Value)
}
}
func main() { // main函数叫做入口函数,go约定main函数必须在main包中定义
var list1 list.List
printList("测试声明list", list1)
list1.PushFront(true)
list1.PushFront("aaa")
list1.PushFront(111)
// 尾部添加
list1.PushBack("2222")
printList( ...
Go函数
Go函数函数数学定义
y=f(x) ,y是x的函数,x是自变量。y=f(x0,x1,…,xn)
Go函数
由若干语句组成的语句块、函数名称、参数列表、返回值构成,他是组织代码的最小单元
完成一定的功能
函数的作用
结构化编程对代码的最基本的封装,一般按照功能组织一段代码
封装的目录是为了复用,减少冗余代码
代码更加简洁美观、可读易懂
函数的分类
内建函数,如make、new、panic等
库函数,如math.Ceil()等
自定义函数,使用func 关键字定义
函数定义func 函数名(参数列表) 返回值{
函数体
[return 返回值]
}
return可有可无
函数名就是标识符,命名要求一样
定义中的参数列表成为形式参数,只是一种符号表达,简称形参
返回值列表可有可无,需要return语句配合,表示一个功能函数执行完返回的结果
函数名(参数列表) [返回值列表]称为函数签名
Go语言中形参也 被称为入参,返回值也被称为出参
函数调用
函数定义,只是声明了一个函数,它不能被执行,需要调用执行
调用的方式就是 ...
Golang哈希表
哈希表映射映射Map,也称为字典
长度可变
存储的元素是key-value对(键值对),value可变
key无序不重复
不可索引,需要通过key来访问
不支持零值可用,也就是说,必须要用make或字面常量构造
引用类型
哈希表
哈希表
map是go中的实现
存储kv对,一个kv对,称为一个元素,键值对称为entry、item
len表示元素的个数,即kv对的个数
key不能重复且无序
key按照某种先后顺序加入到map中,但是从哈希表中看不出顺序来
key是关键的,唯一的
相同的key会去重
无序:
在顺序表中,x、y,用顺序表认为x是y的前驱,y是x的后继
在hash table中,x、y如果是key,那么x、y没有前后依存关系,是独立且唯一的key,在内存中位置不确定
不是线性表,是无序的,不能索引
是引用类型
有一个标头值
有一个指针指向低层的hash表
不支持零值可用
高效的,利用key,用空间换时间
哈希表原理内存是线性编制的,容器都要划分格子(存储单元),每个存储单元占用的字节数相同
hash(key) => 存储单元房间号,每个通过一个 ...
Django视图类View源码分析
Django视图类View源码分析一、视图函数django中的视图函数,就是视图功能由函数实现。
响应:或渲染模板后返回HTML,或直接返回JSON数据。
参数:视图函数的第一个参数必须是request对象。
文本响应from django.http import HttpRequest,HttpResponse,JsonResponse
def test_index(request:HttpRequest):
data = 'Test String'
return HttpResponse(data)
JSON响应from django.http import HttpRequest, HttpResponse, JsonResponse
def test_index(request:HttpRequest):
data = [1, 2, 3]
return JsonResponse(data)
这里会抛异常,TypeError: In order to allow non-dict objects to be serialized set the s ...
Golang字符串
字符串stringASCIIASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套单字节编码系统
ASCII编码表:
数字和字符映射表,包括了英文字符和标点,用一个字节表示256种状态,用低7位128种状态就够了,0~127,都有对应的字符,包括可见字符、不可见字符、控制字符等。剩下的128种状态,用来扩展ASCII、欧洲字符编码表Latin-x
中文编码表:
数字到中文单一字符映射,至少常用的3k~5k个汉字,一个字节不够放,汉字只能多个字节存储
2字节,65536种状态,GB2312、GBK(包含了GB2312)、GB18030、BIG 5码
所有编码表都兼容单字节的ASCII表,但是如果有一篇文章需要多语言存储,如何实现?
UNICODE:
多字节编码表,一张编码表解决全球多数字符对应问题
表示汉字多数使用两个字节
Go中’x’ 方式,保存int32、rune整数型,%c打印通过unicode编码表找到字符输出
UTF-8:
多字节
汉字转为3个字节
utf8mb4包含表情 ...
Golang线性表-数组、切片
线性表-数组、切片一、数据结构1、数值处理取整 // 整除
fmt.Println(3/2, -1/2, -3/2)
// 向上取整
fmt.Println(math.Ceil(2.01), math.Ceil(2.5), math.Ceil(2.9))
fmt.Println(math.Ceil(-2.01), math.Ceil(-2.5), math.Ceil(-2.9))
// 向下取整
fmt.Println(math.Floor(2.31), math.Floor(2.54), math.Floor(2.99))
fmt.Println(math.Floor(-2.31), math.Floor(-2.54), math.Floor(-2.99))
// 四舍五入
fmt.Println(math.Round(3.44449), math.Round(3.9), math.Round(3.555))
fmt.Println(math.Round(-3.44449), math.Round(-3.9), math.Round(-3.555))
// 输出 ...
Golang分支循环随机数
分支、循环、随机数单分支if condition {
代码块
}
if 5>2 {
fmt.Println("5大于2")
}
注意:Go语言中,花括号一定要跟着if、for、func等行的最后,否则语法出错。这其实就是为了解决C风格、Java风格之争。
condititon必须是一个bool类型,在GO中,不能使用其他类型等效为布尔值。if 1{} 是错误的
语句块中可以写其他代码
如果conditition为true,才能执行其后代码块
多分支if condition1 {
代码块1
} else if condition2 {
代码块2
} else if condition3 {
代码块3
} ... {
...
} else if conditionN {
代码块N
} else {
代码块
}
a := 6
if a & ...
MySQL 数据损坏,通过ibd和frm文件批量恢复数据库数据
问题描述客户那边的测试服务器下午3:00左右因不明原因,所有服务访问不了,ssh也无法连接,客户手动进行强制重启服务器,重启后将所有应用、中间件重启,重启nacos时发现无法连接数据库,通过账号密码登录到数据库发现可以正常登录,但是奇怪的问题来了。。。show tables 时可以正常看到表,但是查询表中数据时发现提示表不存在。。如下图:
查看mysql日志:
作为一名mysql菜的不能再菜的小白。。这属实难到我了,看起来像是数据损坏。。没办法,通过多方查询资料,解决办法如下:
解决办法:首先了解InnoDB引擎创建数据库会产生的文件:
.ibd:包含每个表的数据和索引
.frm:描述表的结构
ibdata1:包含所有表的字典和历史操作
在test目录下,包含每个表的.ibd和.frm文件
恢复前提:ibd文件的数据都是正常的之后也是需要通过这些文件进行恢复,我这边新启了一个mysql实例,过程略,大体的恢复步骤如下:
在新的mysql实例中创建数据库,需要跟原数据库的库名和字符集保持一致
创建数据表,表名要求一致,对应原库data目录下的表名(我这里用工具对原库表的表结构导出 ...