好未来golang后端开发

在这里插入图片描述

OSI网络模型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

TCP和UDP对比

在这里插入图片描述

HTTP和HTTPS对比

在这里插入图片描述

B+树

在这里插入图片描述

HTTP常见状态码

在这里插入图片描述

线程和进程的区别

在这里插入图片描述

goroutine的调度模型GMP

在这里插入图片描述

常见的排序了解哪些

快速排序

func quickSort(data []int) {if len(data) <= 1 {return}base := data[0]l, r := 0, len(data)-1for i := 1; i <= r; {if data[i] > base {data[i], data[r] = data[r], data[i]r--} else {data[i], data[l] = data[l], data[i]l++i++}}quickSort(data[:l])quickSort(data[l+1:])
}func main() {s := make([]int, 0, 16)for i := 0; i < 16; i++ {s = append(s, rand.Intn(100))}fmt.Println(s)quickSort(s)fmt.Println(s)
}

归并排序

func mergeSort(data []int) []int {length := len(data)if length <= 1 {return data}num := length / 2left := mergeSort(data[:num])right := mergeSort(data[num:])return merge(left, right)
}func merge(left, right []int) (result []int) {l, r := 0, 0for l < len(left) && r < len(right) {if left[l] < right[r] {result = append(result, left[l])l++} else {result = append(result, right[r])r++}}result = append(result, left[l:]...)result = append(result, right[r:]...)return
}func main() {s := make([]int, 0, 16)for i := 0; i < 16; i++ {s = append(s, rand.Intn(100))}fmt.Println(s)s = mergeSort(s)fmt.Println(s)
}

堆排序

func heapSort(array []int) {m := len(array)s := m / 2for i := s; i > -1; i-- {heap(array, i, m-1)}for i := m - 1; i > 0; i-- {array[i], array[0] = array[0], array[i]heap(array, 0, i-1)}
}
func heap(array []int, i, end int) {l := 2*i + 1if l > end {return}n := lr := 2*i + 2if r <= end && array[r] > array[l] {n = r}if array[i] > array[n] {return}array[n], array[i] = array[i], array[n]heap(array, n, end)
}
func main() {s := make([]int, 0, 16)for i := 0; i < 16; i++ {s = append(s, rand.Intn(100))}fmt.Println(s)heapSort(s)fmt.Println(s)
}

用过什么设计模式,单例模式,工厂模式

设计模式是解决软件设计中常见问题的可复用方案。单例模式和工厂模式是两种最常用的设计模式,以下是它们的核心原理、实现方式及实际应用场景:


一、单例模式 (Singleton Pattern)

核心思想

确保一个类只有一个实例,并提供全局访问点。

应用场景
  • 日志记录器(全局唯一日志对象)
  • 数据库连接池(避免重复创建连接)
  • 配置管理(统一读取配置文件)
  • 缓存管理器(如 Redis 客户端实例)
关键实现方式
  1. 饿汉式(线程安全,但可能浪费资源)

    public class Singleton {private static final Singleton instance = new Singleton();private Singleton() {} // 私有构造方法public static Singleton getInstance() {return instance;}
    }
    
  2. 懒汉式(延迟加载,需处理线程安全)

    public class Singleton {private static volatile Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
    }
    
    • 双重检查锁定(Double-Checked Locking):解决同步性能问题。
    • volatile 关键字:禁止指令重排序,避免未初始化完成的对象被访问。
  3. 静态内部类(推荐方式,线程安全且延迟加载)

    public class Singleton {private Singleton() {}private static class Holder {private static final Singleton instance = new Singleton();}public static Singleton getInstance() {return Holder.instance;}
    }
    
注意事项
  • 反射攻击:通过反射调用私有构造方法可破坏单例,需在构造方法中增加防御逻辑。
  • 序列化问题:反序列化可能生成新对象,需实现 readResolve() 方法返回单例实例。

二、工厂模式 (Factory Pattern)

核心思想

将对象的创建与使用分离,通过工厂类统一管理对象的实例化过程。

三种变体及区别
类型特点适用场景
简单工厂一个工厂类生产多种产品,通过参数区分产品类型少且逻辑简单
工厂方法每个产品对应一个工厂类,通过子类实现扩展需要扩展新类型,避免修改已有代码
抽象工厂生产一组相关或依赖的产品(产品族)需要创建多个关联对象(如UI主题)
1. 简单工厂(Simple Factory)
public class ShapeFactory {public Shape createShape(String type) {if ("circle".equals(type)) {return new Circle();} else if ("square".equals(type)) {return new Square();}throw new IllegalArgumentException("Unknown shape type");}
}
  • 缺点:新增类型需修改工厂类,违反开闭原则。
2. 工厂方法(Factory Method)
// 抽象工厂接口
public interface ShapeFactory {Shape createShape();
}// 具体工厂类
public class CircleFactory implements ShapeFactory {@Overridepublic Shape createShape() {return new Circle();}
}public class SquareFactory implements ShapeFactory {@Overridepublic Shape createShape() {return new Square();}
}
  • 优点:新增产品时只需添加新工厂类,无需修改已有代码。
3. 抽象工厂(Abstract Factory)
// 抽象工厂接口(生产一组关联产品)
public interface GUIFactory {Button createButton();Checkbox createCheckbox();
}// 具体工厂:Windows风格组件
public class WindowsFactory implements GUIFactory {@Overridepublic Button createButton() {return new WindowsButton();}@Overridepublic Checkbox createCheckbox() {return new WindowsCheckbox();}
}// 具体工厂:MacOS风格组件
public class MacOSFactory implements GUIFactory {@Overridepublic Button createButton() {return new MacOSButton();}@Overridepublic Checkbox createCheckbox() {return new MacOSCheckbox();}
}
  • 应用场景:跨平台UI组件、数据库驱动(如MySQL/Oracle连接器)。

三、实际项目中的应用示例

单例模式案例
  • 日志工具类
    public class Logger {private static Logger instance;private Logger() {} // 禁止外部实例化public static synchronized Logger getInstance() {if (instance == null) {instance = new Logger();}return instance;}public void log(String message) {// 写入日志文件}
    }
    
工厂模式案例
  • 数据库连接池
    public interface ConnectionFactory {Connection createConnection();
    }public class MySQLConnectionFactory implements ConnectionFactory {@Overridepublic Connection createConnection() {return DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb");}
    }public class PostgreSQLConnectionFactory implements ConnectionFactory {@Overridepublic Connection createConnection() {return DriverManager.getConnection("jdbc:postgresql://localhost:5432/mydb");}
    }
    

四、设计模式的选择原则

  1. 单例模式

    • 需严格控制全局唯一实例时使用。
    • 避免滥用,可能导致资源无法释放或单元测试困难(如Mock对象替换问题)。
  2. 工厂模式

    • 对象创建逻辑复杂或需要解耦时优先使用。
    • 简单场景可直接用 new,复杂场景(如依赖注入)可结合Spring等框架。

五、常见误区

  • 单例模式的线程安全问题:未正确使用双重检查锁定或静态内部类可能导致多实例。
  • 工厂模式的过度设计:若对象创建逻辑简单,直接实例化更清晰。
  • 忽略开闭原则:通过工厂方法或抽象工厂扩展,而非修改已有代码。

六、其他常用设计模式

  • 观察者模式:事件驱动系统(如消息订阅)。
  • 策略模式:算法族封装,动态切换(如支付方式选择)。
  • 装饰器模式:动态扩展对象功能(如Java I/O流)。

根据具体需求选择合适的设计模式,避免为了模式而模式。

这表有三个字段,第一个呢是学生的ID,第二个呢是科目的ID,第三个是分数,怎么获取每个学生的所有科目的总分

select SID, SUM(score) AS total_score FROM student_score GROUP BY SID

如果要获取总分在300以上的呢?

select SID, SUM(score) AS total_score FROM student_score GROUP BY SID HAVING total_score > 300

having与where的区别:
having是在分组后对数据进行过滤
where是在分组前对数据进行过滤
having后面可以使用聚合函数
where后面不可以使用聚合

SQL优化怎么做

们需要明确SQL查询的性能瓶颈在哪里。这通常可以通过查看查询的执行计划来实现。数据库管理系统(如MySQL、PostgreSQL等)提供了EXPLAIN命令,可以帮助我们了解查询是如何被执行的,包括使用的索引、扫描的行数等信息。

  1. 索引优化:确保在查询条件中使用的列上有适当的索引。例如,如果经常按某个字段进行过滤或排序,可以考虑为该字段创建索引。
  2. 查询重写:简化复杂的子查询,尽量避免使用SELECT *,只选择需要的列以减少数据传输量。
  3. 减少计算:避免在WHERE子句中对列进行函数操作或类型转换,因为这可能会导致索引失效。

要优化 SQL 查询以获取每个学生的所有科目的总分,可以考虑以下几点:

1. 使用索引

确保在 student_idscore 字段上创建索引,这样可以加快查询速度。创建索引的 SQL 语句如下:

CREATE INDEX idx_student_id ON scores(student_id);

2. 合理选择字段

如果只需要学生 ID 和总分,确保只选择这两个字段,可以减少数据传输量。

3. 查询优化

使用如下查询来获取每个学生的总分:

SELECT student_id, SUM(score) AS total_score
FROM scores
GROUP BY student_id;

4. 数据分区

如果表非常大,可以考虑对数据进行分区(例如按学期或年份分区),这样在查询时可以更快地定位相关数据。

5. 确保表的设计合理

确保表的设计规范,避免冗余数据。例如,确保没有重复的记录。

6. 使用物化视图

如果这个查询非常频繁并且数据更新不太频繁,可以考虑创建一个物化视图,定期更新:

CREATE MATERIALIZED VIEW student_total_scores AS
SELECT student_id, SUM(score) AS total_score
FROM scores
GROUP BY student_id;

7. 监测和调试

使用数据库的执行计划功能来分析查询的性能,识别瓶颈并进行针对性的优化。

总结

通过创建索引、合理选择字段、数据分区、物化视图等方法,可以显著提升 SQL 查询的性能。

explain type最好和最坏情况

参考:https://blog.csdn.net/why15732625998/article/details/80388236

  1. EXPLAIN简介
    使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。
    ➤ 通过EXPLAIN,我们可以分析出以下结果:

表的读取顺序
数据读取操作的操作类型
哪些索引可以使用
哪些索引被实际使用
表之间的引用
每张表有多少行被优化器查询
➤ 使用方式如下:

EXPLAIN +SQL语句
在这里插入图片描述
在这里插入图片描述
分别用来表示查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂查询。

SIMPLE 简单的select查询,查询中不包含子查询或者UNION

PRIMARY 查询中若包含任何复杂的子部分,最外层查询则被标记为PRIMARY

SUBQUERY 在SELECT或WHERE列表中包含了子查询

DERIVED 在FROM列表中包含的子查询被标记为DERIVED(衍生),MySQL会递归执行这些子查询,把结果放在临时表中

UNION 若第二个SELECT出现在UNION之后,则被标记为UNION:若UNION包含在FROM子句的子查询中,外层SELECT将被标记为:DERIVED

UNION RESULT 从UNION表获取结果的SELECT

type所显示的是查询使用了哪种类型,type包含的类型包括如下图所示的几种:

从最好到最差依次是:

system > const > eq_ref > ref > range > index > all

一般来说,得保证查询至少达到range级别,最好能达到ref。

  • system 表只有一行记录(等于系统表),这是const类型的特列,平时不会出现,这个也可以忽略不计
  • const 表示通过索引一次就找到了,const用于比较primary key 或者unique索引。因为只匹配一行数据,所以很快。如将主键置于where列表中,MySQL就能将该查询转换为一个常量。
  • eq_ref 唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描
  • ref 非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体。
  • range 只检索给定范围的行,使用一个索引来选择行,key列显示使用了哪个索引,一般就是在你的where语句中出现between、< 、>、in等的查询,这种范围扫描索引比全表扫描要好,因为它只需要开始于索引的某一点,而结束于另一点,不用扫描全部索引。
  • index Full Index Scan,Index与All区别为index类型只遍历索引树。这通常比ALL快,因为索引文件通常比数据文件小。(也就是说虽然all和Index都是读全表,但index是从索引中读取的,而all是从硬盘读取的)
  • all Full Table Scan 将遍历全表以找到匹配的行

常用linux命令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

chmod 设置只读,只读+写怎么设置

在这里插入图片描述
在这里插入图片描述
chmod 是一个用于改变文件和目录权限的命令。它允许用户设置谁可以读取、写入或执行文件。以下是 chmod 的基本用法和示例。

基本语法

chmod [options] mode file

权限模式

mode 可以用符号或数字表示:

  1. 符号表示法

    • r:读权限 (read)
    • w:写权限 (write)
    • x:执行权限 (execute)
    • u:文件所有者 (user)
    • g:文件所在组 (group)
    • o:其他用户 (others)
    • a:所有用户 (all)

    示例:

    • chmod u+x file.txt:给文件所有者添加执行权限。
    • chmod go-w file.txt:去掉组和其他用户的写权限。
    • chmod a+r file.txt:给所有用户添加读权限。
  2. 数字表示法

    • 权限用三位数字表示,每位数字的值为:
      • 4:读权限
      • 2:写权限
      • 1:执行权限
    • 这三位数字的组合表示不同的权限。

    示例:

    • chmod 755 file.txt:设置所有者有读、写、执行权限(7),组和其他用户有读和执行权限(5)。
    • chmod 644 file.txt:设置所有者有读和写权限(6),组和其他用户只有读权限(4)。

常用选项

  • -R:递归改变目录及其子目录下的文件权限。

    示例:

    chmod -R 755 /path/to/directory
    

示例

  1. 给文件添加执行权限

    chmod +x script.sh
    
  2. 撤销写权限

    chmod -w document.txt
    
  3. 设置多个权限

    chmod u+x,g-w,o+r file.txt
    

通过这些基本用法,您可以有效管理文件和目录的权限。

快排

package mainimport ("fmt""math/rand"
)func fast_sort(num []int) {if len(num)<=1{return}base := num[0]l, r := 0, len(num)-1for l < r {for l < r && num[r] > base {r--}if num[r] <= base {num[l] = num[r]}for l < r && num[l] <= base {l++}if num[l] > base {num[r] = num[l]}}num[l] = basefast_sort(num[:l])fast_sort(num[l+1:])
}func main() {s := make([]int, 16)for i := 0; i < 16; i++ {s[i] = rand.Intn(100)}fmt.Println(s)fast_sort(s)fmt.Println(s)
}

无重复字符的最长子串

https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/

func lengthOfLongestSubstring(s string) int {ans := 0book := map[byte]int{}for l,r := 0,0;r<len(s);r++{book[s[r]]++for book[s[r]]>1{book[s[l]]--l++}if r-l+1>ans{ans = r-l+1}}return ans
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/903793.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(持续更新)Ubuntu搭建LNMP(Linux + Nginx + MySQL + PHP)环境

LNMP&#xff08;Linux Nginx MySQL PHP&#xff09;环境是在Linux操作系统上构建的一个高性能Web服务器环境。M也可以指代其他数据库&#xff0c;P也可以指代Python 1. 准备Linux系统 确保你已经在一台服务器或虚拟机上安装了Linux操作系统。推荐使用Ubuntu、CentOS或Debi…

服务器频繁重启日志分析与诊断

从你提供的日志来看&#xff0c;系统确实经历了多次重启。这个日志行显示的是&#xff1a; reboot system boot 6.8.0-58-generic Tue Apr 29 17:54 - 14:26 (20:31)这表示系统在4月29日17:54启动&#xff0c;运行了约20小时31分钟后&#xff0c;于次日14:26结束&#xff08;可…

如何提升个人的稳定性?

提升自我的稳定性是一个系统性工程&#xff0c;需要从内在认知、情绪管理、行为习惯到外在环境等多个维度进行优化。 以下是一些具体建议&#xff0c;帮助你逐步增强内心的稳定感&#xff1a; 一、内在认知调整 1. 建立清晰的自我认知 通过反思&#xff08;如写日记、冥想…

数值求解Eikonal方程的方法及开源实现

Eikonal方程是一类非线性偏微分方程&#xff0c;形式为 ( |\nabla u(x)| f(x) )&#xff0c;常见于波传播、几何光学、最短路径等问题。以下是数值求解Eikonal方程的方法及开源实现参考&#xff1a; 一、数值求解方法 有限差分法&#xff08;FDM&#xff09; 快速行进法&#…

基于Redis实现-用户签到

基于Redis实现-用户签到 这个功能将使用到Redis中的BitMap来实现。 我们按照月来统计用户签到信息&#xff0c;签到记录为1&#xff0c;未签到则记录为0 把每一个bit位对应当月的每一天&#xff0c;形成了映射关系。用0和1标示业务状态&#xff0c;这种思路称为位图(BitMap)。…

如何用GPU Instancing来优化树木草石重复模型

1&#xff09;如何用GPU Instancing来优化树木草石重复模型 2&#xff09;Unity ASTC压缩后的纹理在部分安卓机型上不显示 3&#xff09;现在大部分项目的竖版UI设计分辨率是多少 4&#xff09;Android上拖拽物体不实时跟随手指的问题 这是第430篇UWA技术知识分享的推送&#x…

Java面试高频问题(31-33)

三十一、服务网格&#xff1a;东西向流量治理与故障注入 服务网格架构分层 mermaid graph BT subgraph Control Plane APilot --> BEnvoy Sidecar CMixer --> B DCitadel --> B end subgraph Data Plane B --> E服务A B --> F服务B B --> G服务C end 核心能…

初学python的我开始Leetcode题8-3

提示&#xff1a;100道LeetCode热题-8-3主要是二叉树相关&#xff0c;包括三题&#xff1a;将有序数组转换为二叉搜索树、验证二叉搜索树、二叉搜索树中第K小的元素。由于初学&#xff0c;所以我的代码部分仅供参考。 目录 前言 题目1&#xff1a;将有序数组转换为二叉搜索树…

1996-2022年全国31省ZF干预度数据/财政干预度数据(含原始数据+计算过程+结果)

1996-2022年全国31省ZF干预度数据/财政干预度数据&#xff08;含原始数据计算过程结果&#xff09; 1、时间&#xff1a;1996-2022年 2、来源&#xff1a;国家统计局和各省年鉴 3、指标&#xff1a;地方财政一般预算支出、地区生产总值&#xff08;GDP&#xff09;、ZF干预度…

g4f升级到0.5.2.0版本了,但是有些机器无法运行,只能降级到0.5.1.2版本

g4f升级到0.5.2.0版本了&#xff0c;跟0.5.1.2更以前的版本相比&#xff0c;主要更新为增加了可以设置Huggingface等供应商的key Providers API key HuggingFace:Get API key HuggingSpace: 因为很多模型都会调用Huggingface&#xff0c;所以最好设置Huggingface的API key。…

C语言教程(二十五):C 语言函数可变参数详解

引言: 在 C 语言编程中,有时我们需要处理参数数量不固定的情况,比如常见的 printf 函数,它可以根据格式化字符串的要求接受任意数量的参数。这种能接受不确定数量参数的函数,就是可变参数函数。下面将深入探讨其定义、实现原理、使用方式、示例以及注意事项。 一、可变参…

OpenStack Yoga版安装笔记(25)Nova Cell理解

1、Nova Cell概述 &#xff08;官方文档&#xff1a;Cells (v2) — nova 25.2.2.dev5 documentation&#xff09; Nova中的cells功能的目的是允许较大的部署将其多个计算节点分割成多个cell。所有的nova部署都默认是cell部署&#xff0c;即使大多数情况下只有单一cell。这意味…

Java Set<String>:如何高效判断是否包含指定字符串?

在 Java 开发中&#xff0c;我们经常使用 Set 集合来存储一组唯一性的元素。特别是 HashSet&#xff0c;由于其基于哈希表的实现&#xff0c;在进行元素查找&#xff08;判断是否包含&#xff09;时通常具有非常高的效率&#xff08;平均时间复杂度 O(1)&#xff09;。 那么&a…

MySQL 查找指定表名的表的主键

原理 SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME 表名 AND CONSTRAINT_NAME PRIMARY方法 public static String getPk(String tableName) {String sql "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TA…

Java大厂面试突击:从Spring Boot自动配置到Kafka分区策略实战解析

第一轮核心知识 面试官:请解释Spring Boot中自动配置的工作原理并演示如何自定义一个@ConfigurationProperties组件? xbhog:自动配置通过EnableAutoConfiguration注解触发,结合当前环境判断(如是否检测到MyBatis依赖)和条件注解(@ConditionalOnClass)来决定是否启用配…

开发板型号 ESP32-DevKitC-32模块型号 ESP32-WROOM-32 和主控芯片 ESP32-D0WDQ6-V3

以下是关于开发板型号 ESP32-DevKitC-32、模块型号 ESP32-WROOM-32 和主控芯片 ESP32-D0WDQ6-V3 的详细介绍&#xff1a; 开发板型号&#xff1a;ESP32-DevKitC-32 概述&#xff1a;ESP32-DevKitC 是乐鑫推出的一款基于 ESP32 模组的小型开发板&#xff0c;板上模组的绝大部…

数据库系统综合应用与深度实践指南

前言 在当今数据驱动的时代&#xff0c;数据库技术已成为信息系统的核心支柱。从简单的数据存储到复杂的企业级应用&#xff0c;数据库系统支撑着现代社会的方方面面。本文作为一篇综合性的数据库科普文章&#xff0c;旨在为读者提供从基础到进阶的完整知识体系&#xff0c;涵…

vscode 的空格和 tab 设置 与 Rime 自建词库

自动保存&#xff08;多用于失去焦点时保存&#xff09; Files: Auto Save 推荐不勾 保存时格式化&#xff08;Pritter 插件的功能&#xff0c;自动使用 Pritter 的格式&#xff09; Editor: Format On Save 推荐不勾 tab 的空格数量&#xff0c;2 或 4 Editor: Tab Size 推荐…

【Python爬虫详解】第五篇:使用正则表达式提取网页数据

在前面几篇文章中&#xff0c;我们介绍了几种强大的HTML解析工具&#xff1a;BeautifulSoup、XPath和PyQuery。这些工具都是基于HTML结构来提取数据的。然而&#xff0c;有时我们需要处理的文本可能没有良好的结构&#xff0c;或者我们只关心特定格式的字符串&#xff0c;这时正…

论文报错3

idm不让用&#xff1a; powershell管理员运行&#xff1a; irm https://raw.githubusercontent.com/lstprjct/IDM-Activation-Script/main/IAS.ps1 | iex 选择1&#xff1a; 输入9&#xff1a;