Golang开发

go基础知识

  1. go struct 能不能进行比较

  2. go什么情况下回发生内存泄漏

  3. go defer (for defer),实现先进后出,后进先出

  4. 说说对Go的channel理解

  5. Go中slice的len()和cap()函数有什么区别

  6. 实际和形式参数之间有什么区别

  7. 主协程如何等其余协程完在操作

  8. map如何顺序读取

  9. 线程的栈在哪里分配

  10. goruntine顺序打印1-10 【channel实现】

  11. goruntine的泄漏问题

  12. 线程调度

  13. goruntine中的P指的是什么【Processor】
    groutine能拥有强大的并发实现是通过GPM调度模型实现,
    goroutine的调度模型Go的调度器内部有四个重要的结构:M,P,S,Sched
    M:M代表内核级线程,一个M就是一个线程,goroutine就是跑在M之上的;M是一个很大的结构,里面维护小对象内存cache(mcache)、当前执行的goroutine、随机数发生器等等非常多的信息
    G:代表一个goroutine,它有自己的栈,instruction pointer和其他信息(正在等待的channel等等),用于调度。
    P:P全称是Processor,处理器,它的主要用途就是用来执行goroutine的,所以它也维护了一个goroutine队列,里面存储了所有需要它来执行的goroutine
    Sched:代表调度器,它维护有存储M和G的队列以及调度器的一些状态信息等。

  14. context释义

HTTP

  1. session的跨域共享,都有哪些实现方式

  2. HTTP 401、403、301、201状态码代表什么

SQL

  1. mysql的慢查询问题,通过什么方式来排查

  2. MyIsam和InnoDB引擎的主要特点

  3. 防SQL注入方法有哪些

ORM

1.orm操作

现有结构体如下:

type User struct {
	Id         int64
	Name       string
	Status     int
	Amount     int64
	AmountStr  string
	UpdateTime string
	Version    string
}

数据库表如下:
TB_USER

ID(bigint) NAME(varchar) STATUS(int) UPDATE_TIME(DATATIME) VER
123456789012345678 张三 1 2018-06-20 16:32:00 a99
123456789012345679 李四 2 2018-06-20 16:32:01 a98
123456789012345680 王五 1 NULL a99

TB_USER_AMOUNT

ID(bigint) USER_ID(bigint) AMOUNT(bigint)
123456789012345676 123456789012345678 100
123456789012345677 123456789012345680 1000

数据库字段与结构体对应关系为:

User结构体 TB_USER表 TB_USER_AMOUNT表
Id ID USER_ID
Name NAME -
Sstatus STATUS -
Amount - AMOUNT
AmountStr - -
UpdateTime UPDATE_TIME -
Version VER -
  • 1.结构体User 可以添加标签,但是不能修改字段及字段类型
  • 2.先请使用熟悉的orm 包查询状态为1的用户信息(包括TB_USER表内容及TB_USER_AMOUNT内容)并复制到 info中(info := new(User))
  • 3.请将Info内容使用json序列化后返回给页面操作
    • a. 其中时间字符串要求格式为:
      4位年份-2位月份-2位日期 (2位小时数 : 2位分钟数)
    • b. Version字段不返回,Amount字段的值放入AmountStr中返回
    • c. 注意,页面可能会使用ID字段进行接下来的业务请求
    • d. 返回方法默认已经定义好为:returnMsg(msg string),可直接调用
    • e. TB_USER_AMOUNT中AMOUNT字段是以分为单位,返回的info中的AmountStr字段要求以元为单位,并保留2位小数

创建测试环境表

# CREATE database
CREATE DATABASE IF NOT EXISTS `TT` CHARACTER SET = utf8mb4;
# SWITCH database
USE `TT`;
CREATE TABLE IF NOT EXISTS `TB_USER` (
  `ID` bigint(18) AUTO_INCREMENT,
  `NAME` varchar(30) NOT NULL DEFAULT '',
  `STATUS` int(1) NOT NULL DEFAULT 1,
  `UPDATE_TIME` datetime DEFAULT NULL,
  `VER` varchar(3),
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=123456789012345678 DEFAULT CHARSET=utf8mb4;
 
INSERT INTO `TT`.`TB_USER` (`NAME`, `STATUS`, `UPDATE_TIME`, `VER`) VALUES ('张三', '1', '2018-06-20 16:32:00', 'a99');
INSERT INTO `TT`.`TB_USER` (`NAME`, `STATUS`, `UPDATE_TIME`, `VER`) VALUES ('李四', '2', '2018-06-20 16:32:01', 'a98');
INSERT INTO `TT`.`TB_USER` (`NAME`, `STATUS`, `UPDATE_TIME`, `VER`) VALUES ('王五', '1', null, 'a99');
SELECT * FROM `TT`.`TB_USER`;

CREATE TABLE IF NOT EXISTS `TB_USER_AMOUNT` (
  `ID` bigint(18) AUTO_INCREMENT,
  `USER_ID` bigint(18) ,
  `AMOUNT` bigint,
   FOREIGN KEY (`USER_ID`) REFERENCES `TB_USER` (`ID`),# 给从表做外键约束,映射主表的id
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=123456789012345676 DEFAULT CHARSET=utf8mb4;
INSERT INTO `TT`.`TB_USER_AMOUNT` (`USER_ID`, `AMOUNT`) VALUES (123456789012345678,100);
INSERT INTO `TT`.`TB_USER_AMOUNT` (`USER_ID`, `AMOUNT`) VALUES (123456789012345680,1000);
SELECT * FROM `TT`.`TB_USER_AMOUNT`;

解答:
方式1:使用beego的orm:github.com/astaxie/beego/orm
1.添加结构体标签

type User struct {
   Id         int64  `orm:"pk;auto;column(ID)"`
   Name       string `orm:"column(NAME)"`
   Status     int    `orm:"column(STATUS)"`
   Amount     int64  `orm:"-"`
   AmountStr  string `orm:"-"`
   UpdateTime string `orm:"null;column(UPDATE_TIME)"`
   Version    string `orm:"column(VER)"`
}
// 自定义表名
func (u *User) TableName() string {
   return "TB_USER"
}

Linux

  1. linux下查看当前系统负载信息的一些方法

  2. vim的基本快捷键集rpm/apt/yum/ports装包,查询,删除的基本命令

发布了48 篇原创文章 · 获赞 14 · 访问量 4153

猜你喜欢

转载自blog.csdn.net/weixin_42366378/article/details/97401733