Golang常见面试题

golang基础 map和slice的扩容机制 slice扩容 slice扩容主要依赖于growslice函数以下是growslice函数关于扩容部分的细节 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 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 func growslice(oldPtr unsafe....

June 11, 2024 · 9 min · 1813 words · ecturing

OrangePi4LTS USB Uboot

OrangePi-Build下载 在GitHub中搜索xunlong-OrangePi-Build,这是OrangePi官方提供的构建工具。主要用于构建Uboot,Kernel和编译内核,该构建系统有版本限制要求,推荐Ubuntu20.04版本,版本过高或过低还有wsl均不支持编译,配置好环境然后下载完成后命令行运行./build.sh进行编译。进入以下界面 选择Uboot单元,并选择自己的开发板后,系统会自动下载依赖然后进行编译。 可能遇到的故障 如果仅仅是升级Uboot,编译好后直接会产生deb文件,直接参考手册安装,运行即可,但是对于需要修改启动项来说,需要串口工具进行连接,进入Uboot命令行。官方推荐ch340的USB转串口工具,可是我使用的ch340工具在mobaxterm中存在输入乱码,SecureCRT直接无法输入,流模式已经关闭仍然无效,在网络查询均没有结果,遂尝试降低波特率,OrangePi4LTS的Uboot和系统波特率均为1500000,高波特率有部分USB转串口工具支持不全。波特率有两个阶段修改,1是在Uboot阶段,2是系统启动后阶段,我们修改Uboot阶段波特率以便能进入Uboot命令行。 首先上面的构建工具先要完整构建一遍,构建后进入userpatches文件夹,打开config-default.conf文件,修改IGNORE_UPDATES=““的值为INGORE_UPDATES=“yes”,然后进入u-boot文件夹,进入编译的Uboot版本文件夹,然后进入configs文件夹,搜索自己的主板_defconfig配置文件,找到后搜索CONFIG_BAUDRATE字段,修改波特率,然后重新进入编译界面进行编译Uboot。由于OrangePi本身不支持U盘中系统的直接启动,所以我们通过再SD卡或Emmc中烧录Uboot,从Uboot引导U盘的系统。所以,进入u-boot文件夹,进入生成的uboot资源文件夹,拷贝出idbloader.img和u-boot.itb文件,然后进行烧录。 USB系统准备 使用OrangePi官方提供的系统以及刷写系统教程进行系统刷入到USB设备,此处不再赘述 烧录Uboot 对于烧录程序,我们通过对构建系统产生的deb文件进行解包,发现内部存在一个sh脚本存在着对uboot的烧录程序 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 DIR=/usr/lib/linux-u-boot-next-orangepi4-lts_3.1.0_arm64 write_uboot_platform () { if [[ -f $1/rksd_loader.img ]]; then dd if=$1/rksd_loader.img of=$2 seek=64 conv=notrunc status=none > /dev/null 2>&1; else if [[ -f $1/u-boot....

May 28, 2024 · 2 min · 227 words · ecturing

非阻塞并发队列算法

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 structure pointer_t {ptr: pointer to node_t, count: unsigned integer} structure node_t {value: data type, next: pointer_t} structure queue_t {Head: pointer_t, Tail: pointer_t} initialize(Q: pointer to queue_t) node = new_node() // 创建新的空闲节点 node->next....

April 23, 2024 · 2 min · 312 words · ecturing

关系代数

关系代数 关系代数:并,交,差 知识较为简单,并,交,差其实就是类似于高中数学的集合的并,交,差 并:$\cup$ 取并集:二者元素之和去重 交:$\cap$ 取交集:二者元素之和留重复 差:$-$ 取差集:顾名思义,两个关系之间独有的部分,元组做差有顺序差别 笛卡尔积:$\times$ 笛卡尔积:笛卡尔积类似于乘积,是两个关系中所有可能出现的元组组合关系 关系代数:投影,选择与连接 投影与选择的关系:投影对应sql的where语句,选择对应sql的select语句。 投影:$\pi$ 投影是根据规则从一个关系中选择某些列,形成一个新的关系。 选择:$\sigma$ 对应SQL的select语句,基于某种条件从关系中选择出一些元组。 实例 1 select username from user where userid='1' $$ \Pi_{username}(\sigma_{userid=’{1}’}(user)) $$ 连接 $\theta$连接:$\theta$ $\theta$连接本身是从两个关系的笛卡尔积中获取满足条件的元组,可以是等值,也可以是大于小于 等值连接:R与S的A,B元组的等值连接:$R\underset{{A=B}}{\bowtie}S$ 自然连接:$\bowtie$ 一种更为常见的连接方式,若关系R,S有同名的属性,而且连接条件是R和S中的同名属性列值相同,则称为自然连接。 除 最复杂的计算,

April 6, 2024 · 1 min · 36 words · ecturing

NAT与内网穿透

NAT与内网穿透 写在前面 NAT(network adress transform):中文名:网络地址转换技术,是为了解决由于日渐增长的网络设备数量,IPV4地址池逐渐枯竭问题而诞生,路由设备通过NAT地址转换来节省IPV4地址,同时根据不同的映射方式有些不同的NAT映射类型,同时也为某些网络通信带来了一定的困难。 P2P(Peer To Peer):点对点通信协议,现运营商已基本封堵,封堵原因除了传播违法,不遵守专利信息以外,主要是对运营商带宽的吞噬,因为P2P中每个设备既是客户端又是服务端,一个客户端可以利用其他客户端上的内容进行加速,不需要中心服务器进行调度,这样少了服务器的带宽费用。 全锥形NAT 最简单的NAT类型,路由设备通过IP+端口的方式唯一确定一个子网设备,子网设备与广域网设备的交互就通过路由维护的表进行数据转发,公网设备在防火墙顺利通过情况下可以直接访问子网设备 受限型NAT 全锥形的子类型,添加了限制条件,当内网主机已经访问过一次广域网主机后,公网主机能发送数据给子网设备 端口限制型NAT 全锥形的子类型,在受限型NAT添加了更严格的限制条件,子网设备访问目标设备的确定端口进行交流,在受限型NAT下,只要IP地址没变,端口不同也能互相通信,但是端口受限型指定必须是上一次交流的端口,不然开启新映射。 对称性NAT 最严格的NAT类型,P2P通信被严格限制,而且顾名思义公网设备与子网设备对称,对称性NAT通过四元组确定一个映射$M=SA,SP,TA,TP$,SA为源地址,SP为源端口,TA为目标地址,TP为目标端口,四元组一个中一个不同就是一个新映射。 对称性NAT与端口限制型区别? 锥形和对称性顾名思义,锥形NAT下,考虑的都是目标地址和端口,内网设备IP和端口不在考虑中,而对称性NAT下,内网设备IP和端口也是影响映射的因素。

March 19, 2024 · 1 min · 18 words · ecturing