Golang开发

本文深入探讨Go语言的基础知识,包括struct比较、内存泄漏、defer机制、channel理解、slice与map的高级应用,以及goroutine的调度模型。同时,文章详细介绍了数据库操作、ORM实践和SQL注入防护策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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张三12018-06-20 16:32:00a99
123456789012345679李四22018-06-20 16:32:01a98
123456789012345680王五1NULLa99

TB_USER_AMOUNT

ID(bigint)USER_ID(bigint)AMOUNT(bigint)
123456789012345676123456789012345678100
1234567890123456771234567890123456801000

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

User结构体TB_USER表TB_USER_AMOUNT表
IdIDUSER_ID
NameNAME-
SstatusSTATUS-
Amount-AMOUNT
AmountStr--
UpdateTimeUPDATE_TIME-
VersionVER-
  • 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装包,查询,删除的基本命令

### Golang 开发入门与教程 GolangGo语言)是一种由Google开发的开源编程语言,因其简洁、高效和强大的并发支持而备受开发者青睐。以下将详细介绍如何入门Golang开发以及相关资源。 #### 1. 安装Golang环境 要开始使用Golang进行开发,首先需要安装其开发环境。可以从官方网站或中文社区下载适合操作系统的安装包[^2]。例如,可以访问Golang中文社区提供的下载地址:Go下载 - Go语言中文网 - Golang中文社区 (1.15.6版本)[^1]。安装完成后,可以在命令行中输入以下命令验证是否成功安装: ```bash go version ``` 如果显示版本号,则说明安装成功。 #### 2. 基础语法学习 Golang的基础语法包括变量声明、控制结构、函数定义等。以下是几个关键点: - **变量声明**:Golang支持短声明语法`:=`,简化了变量初始化的过程。 - **控制结构**:如`if`、`for`、`switch`等语句,与C语言类似但更简洁。 - **函数定义**:函数通过`func`关键字定义,支持多返回值。 示例代码如下: ```go package main import "fmt" func add(x int, y int) int { return x + y } func main() { fmt.Println(add(4, 5)) // 输出9 } ``` #### 3. 管道(Channel)与并发 Golang的一大特色是其对并发的支持,主要通过goroutine和channel实现。管道(Channel)用于在不同的goroutine之间传递数据。以下是一个简单的管道使用示例[^3]: ```go package main import "fmt" func main() { mych := make(chan int, 3) mych <- 666 mych <- 777 mych <- 888 close(mych) for num, ok := <-mych; ok; num, ok = <-mych { fmt.Println(num) } fmt.Println("数据读取完毕") } ``` #### 4. 代码风格与注释 良好的代码风格对于团队协作至关重要。Go官方推荐使用行注释来注释整个方法和语句[^4]。例如: ```go // 这是一个行注释 fmt.Println("这个可以输出") ``` #### 5. 学习资源推荐 - **官方文档**:golang.org/doc[^2] - **中文社区**:Go语言中文网[^1] - **在线教程**:Golang后端开发入门教程[^2] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值