meowrain

MeowRain

Life is Simple

Golang内存逃逸

什么是内存逃逸? 逃逸值得是在函数内部创建的对象或者变量,在函数结束后,仍然被其它部分引用或者持有 对内存管理的理解 堆内存一般来说是人为手动进行管理,手动申请分配和释放的。一般硬件内存有多大,堆内存就有多大,适合不可预知大小的内存分配,分配速度较慢,而且会形成内存碎片。(在 Go 语言中,因为 Go 有 GC 自动管理,所以程序员不需要手动释放内存) 栈内存是一种有特殊规则的线性表数据结构,由编译器进行管理,自动申请,分配和释放,大小一般是固定的,它的分配速度非常快,因为只需要移动栈顶指针 内存逃逸带来的影响 当对象或者变量等一些本应在站上分配的变量,因为其生命周期超出了函数范围,不得不分配到堆上。 这时候就会引起 性能开销 堆分配比栈分配慢 垃圾回收也会带来开销 内存碎片 堆内存很容易产生内存碎片 缓存局部性 栈内存通常具有更好的缓存局部性,因为栈上的数据通常是连续分配的,而且生命周期短。 堆内存的分配是分散的,可能导致缓存未命中的问题,影响性能。 导致内存逃逸的原因 变量的生命周期超出了栈内存的活动范围 编译时不知道变量大小,因为栈内存的分配需要编译器在编译时知道变量的大小和生命周期 编译时无法确定变量大小的情况: 如果变量的大小在编译时无法确定(例如动态数组、切片、映射等),编译器无法在栈上为其分配固定大小的内存。 此时,编译器会将这些变量分配到堆上,以确保程序能够正常运行。 Golang 的内存分片基本原则 指向栈上对象的指针不能被存储到堆中 指向栈上对象的指针不能超过该栈对象的生命周期

Golang切片原理

Golang 切片原理 扩容规律 切片作为参数 Go 语言的函数参数传递,只有值传递,没有引用传递,切片作为参数也是如此 我们来验证这一点 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package main import "fmt" func main() { sl := []int{6, 6, 6} f(sl) fmt.Println(sl) } func f(sl []int) { for i := 0; i < 3; i++ { sl = append(sl, i) } fmt.Println(sl) } 可以看到,输出的 sl 的值是不一样的,也就是说,f 函数没能修改主函数中的 sl 变量,而只是修改了形参 sl 变量的内容 当我们传递一个切片给函数的时候,函数接收到的其实是这个切片的一个副本,但是他们的 array 字段指向的是同一个底层数组。 这意味着,如果我们修改底层数组,是会影响到实参和形参的。

Golang数组与切片的区别

Golang 数组与切片的区别 数组与切片的基本概念 1.1 数组的定义和初始化 数组是一种固定长度的数据结构,声明时需要指定长度。 1 2 3 4 5 6 7 8 package main import "fmt" func main() { var a [3]int = [3]int{1, 2, 3} fmt.Println(a) } 1.2 切片的定义和初始化 切片是一个动态的长度可变的序列,切片初始化与定义不需要指定长度,而是通过对数组的引用来创建 1 2 3 4 5 6 7 8 package main import "fmt" func main() { var a []int = []int{1, 2, 3, 4, 5, 6, 7} fmt.Println(a) } 数组与切片的区别 2.1 大小和长度 数组是大小固定的,声明时需要指定长度 切片的大小是可变的,长度可以随着元素的增加而增加,不需要在声明的时候指定长度 2.2 传递方式 数组和切片在作为参数传递的时候,都是值传递,但是因为切片和切片的副本的指向的底层数组是相同的。 2.3 初始化 数组需要指定长度并且逐个赋值,也可以使用字面量赋值

Golang_defer执行顺序

Golang defer Golang defer 执行时机 defer 语句在声明时,会立即计算其参数的值并将函数与参数绑定,但函数体的执行会延迟到外层函数即将返回时。 如果在函数中有多个 defer,它们会按照后进先出的顺序执行,类似栈结构 看下面的例子 1 2 3 4 5 6 7 8 9 10 11 12 13 package main import "fmt" func example() { defer fmt.Println("First") defer fmt.Println("Second") fmt.Println("Inner") } func main() { example() } defer 和匿名函数的一些问题和疑惑 直接声明 defer 匿名函数,参数不通过匿名函数的参数传入 这个其实就是 匿名函数捕获外部变量(闭包行为): 匿名函数会捕获变量的引用(即变量地址),而不是变量值。 如果变量在 defer 注册之后发生了变化,匿名函数使用的值也会随之变化。 1 2 3 4 5 6 7 8 9 10 11 12 package main import "fmt" func main() { x := 10 defer func() { fmt.

Vue 表单输入与绑定

表单输入与绑定 v-model 使用 输入框 复选框 1 2 3 4 5 6 7 8 9 10 11 12 <script setup lang="ts"> import {ref,reactive} from 'vue'; const text = ref(false) </script> <template> <div> <p>isPressed: {{text}}</p> <input type="checkbox" v-model="text"> </div> </template> 复选框 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <script setup lang="ts"> import {ref,reactive} from 'vue'; const checkedNames = ref([]) </script> <template> <div> <div>Checked names: {{ checkedNames }}</div> <input type="checkbox" value="Jack" v-model="checkedNames" /> <label for="jack">Jack</label> <input type="checkbox" value="John" v-model="checkedNames" /> <label for="john">John</label> </div> </template> 单选按钮 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <script setup lang="ts"> import {ref,reactive} from 'vue'; const picked = ref() </script> <template> <div> <div>Picked: {{ picked }}</div> <input type="radio" id="one" value="One" v-model="picked" /> <label for="one">One</label> <input type="radio" id="two" value="Two" v-model="picked" /> <label for="two">Two</label> </div> </template> 选择器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <script setup lang="ts"> import {ref,reactive} from 'vue'; const selected = ref() </script> <template> <div> <div>selected: {{selected}}</div> <select v-model="selected" > <option disabled>Please select one</option> <option selected>A</option> <option>B</option> <option>C</option> <option>D</option> </select> </div> </template> 使用 v-for 动态渲染

Nuxt封装axios为plugin

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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 import type { AxiosInstance, AxiosResponse, InternalAxiosRequestConfig, } from "axios"; import axios from "axios"; declare module "#app" { interface NuxtApp { $axios: AxiosInstance; } } const handleRequestHeader = (config: InternalAxiosRequestConfig<any>) => { const token = localStorage.

Axios封装实例

AXIOS请求执行过程 请求流程和拦截器 代码 封装好 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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 import type { AxiosInstance, AxiosResponse, InternalAxiosRequestConfig, } from "axios"; import axios from "axios"; const handleRequestHeader = (config: InternalAxiosRequestConfig<any>) => { const token = localStorage.

Vue组件值传递

父子组件传值 父组件向子组件传值 defineProps 父组件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <script setup lang="ts"> import { onMounted, ref } from 'vue' import TestView from '../views/TestView.vue' let imgUrl = ref<string>() onMounted(async ()=>{ const response = await fetch('https://api.waifu.pics/sfw/waifu') const json = await response.json() imgUrl.value = json.url; }) </script> <template> <div> <TestView :url="imgUrl"/> </div> </template> <style></style> 子组件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <script setup lang="ts"> import { defineProps, toRef, watch, watchEffect } from 'vue'; const props = defineProps({ url:String }) watch(()=>props.

Mysql8.0配置Windows

下载mysql8.0 https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.40-winx64.zip 解压 改配置文件 新建data文件夹 新建my.ini 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [mysqld] default-time_zone = '+8:00' basedir=D:\Software\mysql-8.0.40-winx64 datadir=D:\Software\mysql-8.0.40-winx64\data bind-address=127.0.0.1 mysqlx-bind-address= 127.0.0.1 max_connections=200 max_connect_errors=10 character-set-server=utf8 [mysql] default-character-set=utf8 [client] port=3306 执行命令 1 2 cd bin .\mysqld.exe --initialize --console 会出现初始密码,临时存一下 1 ./mysqld.exe --install mysql 点任务栏的搜索,搜服务 打开找Mysql 连接mysql 1 mysql -u root -p 会提示输入密码,把刚才的临时密码粘进来就行了 然后需要改密码 1 2 alter user 'root'@'localhost' IDENTIFIED BY '123456'; exit 1 mysql -u root -p 使用图形化 点Installer 下载上安装
0%