明源云golang后端实习笔试

笔试是真不会啊,20个选择,2个编程,3个简答,感觉408都考了,不会的问ai生成一下

选择

有单选和多选,只记得一些了,挑难点的写一下

  1. UDP报文头部不包括哪些内容
  2. http状态码和对应的含义(多选,7个选项好像😅)
  3. http请求报文不包括哪些东西(请求头,请求行,请求体)
  4. mysql中truncate和delete区别
  5. mysql存储时间数据timestamp和datetime之间比较
  6. 给定前序和中序,给出后序遍历的结果
  7. 哪些情况需要切换到内核态: 写入文件,创建子进程、取模

编程(只允许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整个过程
  • 为什么三次握手,四次挥手
#软件开发笔面经#
全部评论

相关推荐

评论
点赞
6
分享

创作者周榜

更多
牛客网
牛客企业服务