地址:basic/task
只出现一次的数字:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
代码:basic/task/singleNumber.go
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 示例 1: 输入:x = 121 输出:true
示例 2: 输入:x = -121 输出:false 解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
代码:basic/task/isPalindrome.go
给定一个只包含 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:输入:s = "()[]{}",输出:true
示例 2:输入:s = "(]",输出:false
代码:basic/task/isValidBrackets.go
编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。
示例 1: 输入:strs = ["flower","flow","flight"],输出:"fl"
示例 2: 输入:strs = ["dog","racecar","car"],输出:""
代码:basic/task/mostPrefix.go
给定一个表示 大整数 的整数数组 digits,其中 digits[i] 是整数的第 i 位数字。这些数字按从左到右,从最高位到最低位排列。 这个大整数不包含任何前导 0。将大整数加 1,并返回结果的数字数组。
示例 1: 输入:digits = [1,2,3],输出:[1,2,4]
解释:输入数组表示数字 123。 加 1 后得到 123 + 1 = 124。 因此,结果应该是 [1,2,4]。
示例 3: 输入:digits = [9],输出:[1,0]
解释:输入数组表示数字 9。 加 1 得到了 9 + 1 = 10。 因此,结果应该是 [1,0]。
代码:basic/task/bigIntegerAddOne.go
给你一个有序数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
示例 1:输入:nums = [1,1,2],输出:2, nums = [1,2,_]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
代码:basic/task/removeDuplicateItemInArray.go
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。 请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
示例 1: 输入:intervals = [[1,3],[2,6],[8,10],[15,18]],输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]
代码:basic/task/mergeSection.go
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按任意顺序返回答案。
代码:basic/task/twoSum.go
示例 1: 输入:nums = [2,7,11,15], target = 9 输出:[0,1]
示例 2: 输入:nums = [3,2,4], target = 6 输出:[1,2]
示例 3: 输入:nums = [3,3], target = 6 输出:[0,1]
地址:advanceTask
题目 :编写一个Go程序,定义一个函数,该函数接收一个整数指针作为参数,在函数内部将该指针指向的值增加10, 然后在主函数中调用该函数并输出修改后的值。
考察点 :指针的使用、值传递与引用传递的区别。
题目 :实现一个函数,接收一个整数切片的指针,将切片中的每个元素乘以2。 考察点 :指针运算、切片操作。
代码:advanceTask/task/pointerTask.go
题目 :编写一个程序,使用 go 关键字启动两个协程,一个协程打印从1到10的奇数,另一个协程打印从2到10的偶数。 考察点 : go 关键字的使用、协程的并发执行。 代码:advanceTask/task/routineTask.go
题目 :设计一个任务调度器,接收一组任务(可以用函数表示),并使用协程并发执行这些任务,同时统计每个任务的执行时间。 考察点 :协程原理、并发任务调度。 代码:advanceTask/task/taskExeSync.go
题目 :定义一个 Shape 接口,包含 Area() 和 Perimeter() 两个方法。然后创建 Rectangle 和 Circle 结构体,实现 Shape 接口。在主函数中,创建这两个结构体的实例,并调用它们的 Area() 和 Perimeter() 方法。 考察点 :接口的定义与实现、面向对象编程风格。
题目 :使用组合的方式创建一个 Person 结构体,包含 Name 和 Age 字段,再创建一个 Employee 结构体, 组合 Person 结构体并添加 EmployeeID 字段。为 Employee 结构体实现一个 PrintInfo() 方法,输出员工的信息。 考察点 :组合的使用、方法接收者。
代码:advanceTask/task/oopTask.go
题目 :编写一个程序,使用通道实现两个协程之间的通信。一个协程生成从1到10的整数,并将这些整数发送到通道中, 另一个协程从通道中接收这些整数并打印出来。 考察点 :通道的基本使用、协程间通信。
题目 :实现一个带有缓冲的通道,生产者协程向通道中发送100个整数,消费者协程从通道中接收这些整数并打印。 考察点 :通道的缓冲机制。
代码:advanceTask/task/channelTask.go
题目 :编写一个程序,使用 sync.Mutex 来保护一个共享的计数器。启动10个协程,每个协程对计数器进行1000次递增操作, 最后输出计数器的值。 考察点 : sync.Mutex 的使用、并发数据安全。
题目 :使用原子操作( sync/atomic 包)实现一个无锁的计数器。启动10个协程,每个协程对计数器进行1000次递增操作, 最后输出计数器的值。 考察点 :原子操作、并发数据安全。
代码:advanceTask/task/lockTask.go
代码:gormTask/
假设有一个名为 students 的表,包含字段 id (主键,自增)、 name (学生姓名,字符串类型)、 age (学生年龄,整数类型)、 grade (学生年级,字符串类型)。
要求 : 编写SQL语句向 students 表中插入一条新记录,学生姓名为 "张三",年龄为 20,年级为 "三年级"。 编写SQL语句查询 students 表中所有年龄大于 18 岁的学生信息。 编写SQL语句将 students 表中姓名为 "张三" 的学生年级更新为 "四年级"。 编写SQL语句删除 students 表中年龄小于 15 岁的学生记录。
假设有两个表: accounts 表(包含字段 id 主键, balance 账户余额) transactions 表(包含字段 id 主键, from_account_id 转出账户ID, to_account_id 转入账户ID, amount 转账金额)。
要求 : 编写一个事务,实现从账户 A 向账户 B 转账 100 元的操作。 在事务中,需要先检查账户 A 的余额是否足够,如果足够则从账户 A 扣除 100 元,向账户 B 增加 100 元, 并在 transactions 表中记录该笔转账信息。如果余额不足,则回滚事务。
代码:gormTask/task.sql
假设你已经使用Sqlx连接到一个数据库,并且有一个 employees 表,包含字段 id 、 name 、 department 、 salary 。
要求 :
编写Go代码,使用Sqlx查询 employees 表中所有部门为 "技术部" 的员工信息,并将结果映射到一个自定义的 Employee 结构体切片中。 编写Go代码,使用Sqlx查询 employees 表中工资最高的员工信息,并将结果映射到一个 Employee 结构体中。
假设有一个 books 表,包含字段 id 、 title 、 author 、 price 。
要求 : 定义一个 Book 结构体,包含与 books 表对应的字段。 编写Go代码,使用Sqlx执行一个复杂的查询,例如查询价格大于 50 元的书籍,并将结果映射到 Book 结构体切片中,确保类型安全。
代码:gormTask/dao/sqlxTask.go
代码:gormTask/dao/advanceTask.go
假设你要开发一个博客系统,有以下几个实体: User (用户)、 Post (文章)、 Comment (评论)。
要求 : 使用Gorm定义 User 、 Post 和 Comment 模型,其中 User 与 Post 是一对多关系(一个用户可以发布多篇文章), Post 与 Comment 也是一对多关系(一篇文章可以有多个评论)。 编写Go代码,使用Gorm创建这些模型对应的数据库表。
基于上述博客系统的模型定义。
要求 :
编写Go代码,使用Gorm查询某个用户发布的所有文章及其对应的评论信息。 编写Go代码,使用Gorm查询评论数量最多的文章信息。
继续使用博客系统的模型。
要求 :
为 Post 模型添加一个钩子函数,在文章创建时自动更新用户的文章数量统计字段。 为 Comment 模型添加一个钩子函数,在评论删除时检查文章的评论数量,如果评论数量为 0,则更新文章的评论状态为 "无评论"。
代码:blogManagement
本次作业要求你使用 Go 语言结合 Gin 框架和 GORM 库开发一个个人博客系统的后端,实现博客文章的基本管理功能, 包括文章的创建、读取、更新和删除(CRUD)操作,同时支持用户认证和简单的评论功能。
创建一个新的 Go 项目,使用 go mod init 初始化项目依赖管理。 安装必要的库,如 Gin 框架、GORM 以及数据库驱动(如 MySQL 或 SQLite)。
设计数据库表结构,至少包含以下几个表: users 表:存储用户信息,包括 id 、 username 、 password 、 email 等字段。 posts 表:存储博客文章信息,包括 id 、 title 、 content 、 user_id (关联 users 表的 id )、 created_at 、 updated_at 等字段。 comments 表:存储文章评论信息,包括 id 、 content 、 user_id (关联 users 表的 id )、 post_id (关联 posts 表的 id )、 created_at 等字段。 使用 GORM 定义对应的 Go 模型结构体。
实现用户注册和登录功能,用户注册时需要对密码进行加密存储,登录时验证用户输入的用户名和密码。 使用 JWT(JSON Web Token)实现用户认证和授权,用户登录成功后返回一个 JWT,后续的需要认证的接口需要验证该 JWT 的有效性。
实现文章的创建功能,只有已认证的用户才能创建文章,创建文章时需要提供文章的标题和内容。 实现文章的读取功能,支持获取所有文章列表和单个文章的详细信息。 实现文章的更新功能,只有文章的作者才能更新自己的文章。 实现文章的删除功能,只有文章的作者才能删除自己的文章。
实现评论的创建功能,已认证的用户可以对文章发表评论。 实现评论的读取功能,支持获取某篇文章的所有评论列表。
对可能出现的错误进行统一处理,如数据库连接错误、用户认证失败、文章或评论不存在等,返回合适的 HTTP 状态码和错误信息。 使用日志库记录系统的运行信息和错误信息,方便后续的调试和维护。
完整的项目代码,包括必要的配置文件和依赖管理文件。 提供项目的 README 文件,说明项目的运行环境、依赖安装步骤和启动方式。 可以使用 Postman 或其他工具对接口进行测试,并提供测试用例和测试结果。