明源云golang后端实习笔试
笔试是真不会啊,20个选择,2个编程,3个简答,感觉408都考了,不会的问ai生成一下
选择
有单选和多选,只记得一些了,挑难点的写一下
- UDP报文头部不包括哪些内容
- http状态码和对应的含义(多选,7个选项好像😅)
- http请求报文不包括哪些东西(请求头,请求行,请求体)
- mysql中truncate和delete区别
- mysql存储时间数据timestamp和datetime之间比较
- 给定前序和中序,给出后序遍历的结果
- 哪些情况需要切换到内核态: 写入文件,创建子进程、取模
编程(只允许golang)
- 写一个Connection类,用于建立对不同数据库(比如oracle,sql server)的连接,用户通过配置文件建立连接
package dbconnector
import (
"database/sql"
"encoding/json"
"errors"
"fmt"
"os"
// 数据库驱动(需要先安装)
_ "github.com/microsoft/go-mssqldb" // SQL Server
_ "github.com/sijms/go-ora/v2" // Oracle
_ "github.com/go-sql-driver/mysql" // MySQL
_ "github.com/lib/pq" // PostgreSQL
)
// 配置结构体
type DBConfig struct {
DBType string `json:"db_type"` // 数据库类型
Host string `json:"host"` // 主机地址
Port int `json:"port"` // 端口号
Username string `json:"username"` // 用户名
Password string `json:"password"` // 密码
Database string `json:"database"` // 数据库名/SID
SSLMode string `json:"ssl_mode"` // SSL模式(PostgreSQL需要)
Parameters string `json:"parameters"`// 额外参数
}
// 连接管理器
type Connection struct {
config DBConfig
db *sql.DB
}
// 创建新连接实例
func NewConnection(configFile string) (*Connection, error) {
// 读取配置文件
config, err := loadConfig(configFile)
if err != nil {
return nil, err
}
// 创建连接字符串
connStr, err := buildConnectionString(config)
if err != nil {
return nil, err
}
// 建立数据库连接
db, err := sql.Open(getDriverName(config.DBType), connStr)
if err != nil {
return nil, fmt.Errorf("连接失败: %v", err)
}
// 验证连接
if err = db.Ping(); err != nil {
return nil, fmt.Errorf("连接验证失败: %v", err)
}
return &Connection{
config: config,
db: db,
}, nil
}
// 获取数据库连接对象
func (c *Connection) GetDB() *sql.DB {
return c.db
}
// 关闭连接
func (c *Connection) Close() error {
if c.db != nil {
return c.db.Close()
}
return nil
}
// 加载配置文件
func loadConfig(path string) (DBConfig, error) {
var config DBConfig
file, err := os.ReadFile(path)
if err != nil {
return config, fmt.Errorf("配置文件读取失败: %v", err)
}
if err := json.Unmarshal(file, &config); err != nil {
return config, fmt.Errorf("配置文件解析失败: %v", err)
}
return config, nil
}
// 构建连接字符串
func buildConnectionString(config DBConfig) (string, error) {
switch config.DBType {
case "oracle":
return fmt.Sprintf("oracle://%s:%s@%s:%d/%s",
config.Username, config.Password, config.Host, config.Port, config.Database), nil
case "sqlserver":
return fmt.Sprintf("server=%s;user id=%s;password=%s;port=%d;database=%s;%s",
config.Host, config.Username, config.Password, config.Port, config.Database, config.Parameters), nil
case "postgres":
return fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=%s",
config.Host, config.Port, config.Username, config.Password, config.Database, config.SSLMode), nil
case "mysql":
return fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?%s",
config.Username, config.Password, config.Host, config.Port, config.Database, config.Parameters), nil
default:
return "", errors.New("不支持的数据库类型")
}
}
// 获取驱动名称
func getDriverName(dbType string) string {
switch dbType {
case "oracle": return "oracle"
case "sqlserver": return "sqlserver"
case "postgres": return "postgres"
case "mysql": return "mysql"
default: return ""
}
}
- 两个协程交替打印1-100
//两个协程交替打印1到100
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
wg.Add(2)
ch := make(chan struct{})
go func() {
defer wg.Done()
for i := 1; i <= 100; i += 2 {
fmt.Printf("g 1 print %v\n", i)
ch <- struct{}{}
<-ch
}
}()
go func() {
defer wg.Done()
for i := 2; i <= 100; i += 2 {
<-ch
fmt.Printf("g 2 print %v\n", i)
ch <- struct{}{}
}
}()
wg.Wait()
}
简答
- mysql B+树原理,时间复杂度空间复杂度,并且和B树和跳表比较
- 浏览器输入url整个过程
- 为什么三次握手,四次挥手