明源云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整个过程
- 为什么三次握手,四次挥手