50天精通Golang(第18天)

news2024/9/26 1:18:37

web开发介绍、iris框架安装、HTTP请求和返回、Iris路由处理

一 Web项目开发介绍及实战项目介绍

1.1 引言

本系列课程我们将学些Golang语言中的Web开发框架Iris的相关知识和用法。通过本系列视频课程,大家能够从零到一经历一个完整项目的开发,并在课程中了解实战项目开发的流程和项目设涉及的各个模块。

1.2 Web项目开发介绍

1.2.1项目架构

web项目从大的功能上可以分为前台和后台两个部分。前台主要是我们在浏览器中或者桌面应用、Android、iOS移动应用等直接面向用户的程序,直接接受用户的操作和使用,我们称之为前台,也称之为客户端;为前台应用提供数据和功能调用的部署运行在服务器上的程序,用于操作处理前端应用的数据,我们称之为后台,也称之为服务端。类似于上述这种客户端和服务端的架构,我们通常称之为CS模式,C为client的缩写,S为server的缩写。

1.2.2 开发流程
1.2.2.1 需求确定

在需求确定阶段,主要由产品经理进行确定系统的功能与性能。确认了具体需求后,产品经理会将产品功能进行设计,通常称该阶段为产品原型设计过程。在该阶段,核心目标是确定开发需求,完成产品原型设计。

1.2.2.2 分析与设计

在需求确定以后,接下来进入到分析与设计阶段。在该阶段中,又分为几个小阶段,分别为:架构分析与设计、业务逻辑分析、业务逻辑设计和界面设计等四个阶段。
架构分析与设计: 逻辑架构、物理架构(服务器配置、数据库配置)、技术选型等
业务逻辑分析:系统用户、使用目的、操作步骤、用户体验与反馈等
业务逻辑设计:数据库详细设计、对象关系字段映射等
界面设计:UI风格、用户体验等

1.2.2.3 开发环境搭建

当需求和设计阶段都确定以后,就正式进入开发阶段。首先就是开发环境的搭建,这里面包含硬件环境和软件环境两种。硬件环境是指的开发机器,服务器等硬件设施。软件环境包含开发工具,项目管理平台,软件支持等软件支持。开发环境的搭建一般情况下只有在项目刚刚开始和在项目进行大的架构调整时才需要进行,通常的情况下和日常的迭代开发,可以免去此步骤,直接使用已有的开发环境。

1.2.2.4 开发与测试

在实际的项目开发周期中,进行代码开发的周期往往较短。同时,在代码功能开发结束以后,还需要对系统功能进行测试,此时由项目测试人员进行专业的白盒测试、黑盒测试、性能测试、压力测试等全方位、多角度的系统测试。该阶段的开发与测试是交替进行,在实际的开发过程中会反复进行多轮,以此来保证开发人员开发的功能的正确性,保证系统的稳定性。
当系统开发测试阶段结束以后,会对代码进行封版进行最终测试。如果最终测试通过,则会进行部署上线。

1.2.2.5 文档编纂

在系统设计、项目开发与测试过程中,我们要遵循一套适用于团队使用和可执行可接受的标准化开发步骤。在项目开发过程中,我们需要将项目开发,操作说明,项目架构说明等文档性的内容进行编写并妥善保存,以便在后续项目维护和对接过程中,相关人员对项目能够正确快速的了解和熟悉。

1.3 实战项目功能介绍

在本系列课程中,我们将带大家进行一个后台管理平台项目的实战开发,以帮助大家学习Iris框架的相关用法和项目开发流程。

1.3.1 项目效果

首先我们来看一下项目整体运行后的效果:
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1.2.2 项目架构
  • 前端:vue框架
  • 后端:Go语言Iris框架 + mysql数据库、redis缓存数据库
  • 接口文档工具:
    小幺鸡:http://www.xiaoyaoji.cn/doc/yvnmPtdKK
  • 接口调试工具:Postman
1.2.3 项目开发周期

一周

二 Iris框架

2.1 Golang介绍

Go语言是谷歌推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发Go,是因为过去10多年间软件开发的难度令人沮丧。
谷歌资深软件工程师罗布·派克(Rob Pike)表示,“Go让我体验到了从未有过的开发效率。”派克表示,和今天的C++或C一样,Go是一种系统语言。他解释道,“使用它可以进行快速开发,同时它还是一个真正的编译语言,我们之所以现在将其开源,原因是我们认为它已经非常有用和强大。”
Golang语言的一些的功能:

  • 具有现代的程序语言特色,如垃圾回收,帮助程序设计师处理琐碎和重要的内存管理等问题。Go的速度也非常快,几乎和C或C++程序一样快,且能够快速制作程序。
  • 该软件是专为构建服务器软件所设计(如Google的Gmail),Google认为Go还可应用到其他领域,包括在浏览器内执行软件,取代JavaScript的角色。
  • Go也可解决现今的一大挑战:多核心处理器。一般电脑程序通常依序执行,一次进行一项工作,但多核心处理器更适合并行处理许多工作。
    相较于其他语言,Golang之所以发展迅速,与该语言特有的特色密不可分:
  • 简洁 快速 安全
  • 并行 有趣 开源
  • 内存管理,数组安全,编译迅速

2.2 Iris简介

Iris是一款Go语言中用来开发web应用的框架,该框架支持编写一次并在任何地方以最小的机器功率运行,如Android、ios、Linux和Windows等。该框架只需要一个可执行的服务就可以在平台上运行了。
Iris框架以简单而强大的api而被开发者所熟悉。iris除了为开发者提供非常简单的访问方式外,还同样支持MVC。另外,用iris构建微服务也很容易。
在iris框架的官方网站上,被称为速度最快的Go后端开发框架。在Iris的网站文档上,列出了该框架具备的一些特点和框架特性,列举如下:
1)聚焦高性能
2)健壮的静态路由支持和通配符子域名支持
3)视图系统支持超过5以上模板
4)支持定制事件的高可扩展性Websocket API
5)带有GC, 内存 & redis 提供支持的会话
6)方便的中间件和插件
7)完整REST API
8)能定制HTTP错误
9)源码改变后自动加载
等等还有很多特性,大家可以参考Iris官方文档。在GoWeb开发的诸多框架中,各个维度的性能比较如下:
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.3 Iris框架学习渠道

在学习Iris框架过程时,我们需要有相应的配套资料才能够完成我们的学习。下面是学习Iris框架过程中可能会用到的资料。

2.3.1 官方网站

Iris官网:https://iris-go.com/

2.3.2 框架源码

Iris框架源码地址:https://github.com/kataras/iris

2.3.3 框架学习文档

Iris框架中文学习文档: https://studyiris.com/doc/
当然,还有其他相关资料,比如说xorm框架等,这些我们在后面的课程文档中学习到以后再做解释和说明。

2.4 Iris框架安装

2.4.1 Go版本限制

**环境要求:**iris框架要求golang版本至少为1.8。各位同学可以通过打开终端,执行:go version 命令来查看自己机器的go环境版本。

2.4.2 命令安装

安装Iris框架非常简单,使用go语言的全局安装第三方代码的命令get即可。安装Iris框架的命令如下:

go get -u github.com/kataras/iris

在本地终端中执行如上的安装命令,等待命令执行成功,即表示Iris源码下载安装完成。安装完成Iris框架以后,能够在本地机器的GoPath环境目录中的src/github.com/目录下找到iris框架对应的包名,如下图所示:
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
如图所示的kataras/iris所在的目录就是iris框架的源码,如上图所示即是安装成功。

2.5 源码案例

在iris源码安装完成以后,iris框架为开发者提供了自己学习的实战案例,供开发者自行学习。iris提供的案例在iris框架目录中的_example目录下,在学习时可以进行参考。
接下来我们就可以开始学习iris的相关内容,进行代码开发了。

2.6 Iris构造服务实例

在安装完成Iris的源码后,我们就开始来编写最简单的一个Iris的服务。在Iris中,构建并运行一个服务实例需要两步:

  • 1、通过iris.New()方法可以实例化一个应用服务对象app
  • 2、通过Run方法开启端口监听服务,运行服务实例

如下是一个最简单的服务案例Demo

package main
import "github.com/kataras/iris"
func main() {
	//1.创建app结构体对象
	app := iris.New()
	//2.端口监听
	app.Run(iris.Addr(":7999"), iris.WithoutServerError(iris.ErrServerClosed))
	application.Run(iris.Addr(":8080"))//第一种
	//application.Run(iris.Addr(":8080"), iris.WithoutServerError(iris.ErrServerClosed)) //第二种
}

三 Get、Post、Put等请求及数据返回格式

3.1 数据请求方式的分类

所有的项目中使用的请求都遵循HTTP协议标准,HTTP协议经过了1.0和1.1两个版本的发展。

3.1.1 HTTP1.0

HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。

3.1.2 HTTP1.1

HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

因此,我们可以说,HTTP协议一共定义了八种方法用来对Request-URI网络资源的不同操作方式,这些操作具体为:GET、POST、PUT、DELETE、HEAD、OPTIONS、TRACE、CONNECT等八种操作方式。

3.2 Iris框架的请求处理方式

3.2.1 默认请求处理

Iris框架中服务实例app中包含多个方法,用来支持对上述HTTP多种请求类型的直接处理,直接定义为get方法、post方法、put方法等,app中包含的自动处理路由请求的方法与http请求类型的分类一致。

app := iris.New()
//url: http://localhost:8000/getRequest
//type:GET请求
app.Get("/getRequest", func(context context.Context) {
		path := context.Path()
		app.Logger().Info(path)
})
3.2.2 Handle自定义处理

除了上述1中自动处理各类别的请求外,框架还支持使用通用的Handle方法来自定义编写自己的请求处理类型及对应的方法。

//url: http://localhost:/user/info
//type:POST请求
app.Handle("POST", "/user/info", func(context context.Context) {
		context.WriteString(" User Info is Post Request , Deal is in handle func ")
})
//启动端口监听服务
app.Run(iris.Addr(":8000"))
3.2.3 GET请求

向特定的网络资源数据发起请求。GET请求可以携带请求数据,携带的请求数据会以?分割URL和传输数据,参数之间以&相连,比如http://localhost:3000?name=davie&pwd=123。
如下是一个http的get类型的请求:

http://localhost:8000/userpath

服务端的路由处理方式如下:

//url:http://localhost:8000/userpath
//type:GET请求、用GET方法处理
app.Get("/userpath", func(context context.Context) {
		//获取Path
		path := context.Path()
		//日志输出
		app.Logger().Info(path)
		//写入返回数据:string类型
		context.WriteString("请求路径:" + path)
})

上述为使用已经封装的默认的app.Get方式来处理请求,使用Handle方法来进行处理,如下所示:

//url:http://localhost:8000/hello
//type:GET请求、Handle方法第一个参数为GET,表明是GET请求方式
app.Handle("GET", "/hello", func(context context.Context) {
		context.HTML("<h1> Hello world. </h1>")
})
3.2.4 POST请求

POST请求在进行请求时会将请求数据放在请求body中进行请求,请求数据大小没有限制。在开发过程中,我们使用postman工具来进行POST请求的调试。
POST请求的示例如下所示:

http://localhost:8000/postLogin

服务端的路由处理方式如下:

//type:POST请求
//携带数据:name、pwd命名的请求数据
app.Post("/postLogin", func(context context.Context) {
		//获取请求path
		path := context.Path()
		//日志
		app.Logger().Info(path)
		//获取请求数据字段
		name := context.PostValue("name")
		pwd, err := context.PostValueInt("pwd")
		if err != nil {
			panic(err.Error())
		}
		app.Logger().Info(name, "  ", pwd)
		//返回
		context.HTML(name)
})

上述为使用默认路由请求方法Post方法来进行处理,同时,还可以使用Handle方法来进行处理,如下图:

//url:http://localhost:8000/user/info
//type:POST请求,Handle方法第一个参数为POST,表明是Post请求
app.Handle("POST", "/user/info", func(context context.Context) {
		context.WriteString(" User Info is Post Request , Deal is in handle func ")
})
3.2.5 PUT、DELETE、OPTIONS、HEAD等其他类型请求

除了上述GET、POST最为常见的两种请求方式以外,还有PUT、DELETE、OPTIONS、HEAD等其他类型请求,对于其他类型的请求,如同GET和POST请求一样,都是可以通过两种方式来进行处理:

  • 1、iris框架提供的自动识别请求类型的处理请求方法,如put方法、head方法、options方法、delete方法等
  • 2、使用通用的Handle方法对路由请求进行处理,开发者自己选择具体的请求类型以、对应url和要进行处理的func。

如下是put和delete的请求处理:
PUT请求

//type:PUT类型请求
app.Put("/putinfo", func(context context.Context) {
		path := context.Path()
		app.Logger().Info("请求url:", path)
})

DELETE请求

//type:DELETE类型请求  
app.Delete("/deleteuser", func(context context.Context) {
		path := context.Path()
		app.Logger().Info("Delete请求url:", path)
})

3.3 请求处理的数据格式返回

在本节课程中,我们已经学习了如何对不同类型的请求进行处理以及如何获取请求所携带的数据,当后台接收到请求后,将会对请求进行处理,处理完毕后将数据返回给请求的客户端。接下来,我们看一看如何将数据进行返回,以及都有哪些形式。
在进行请求处理时,处理方法func有一个参数context。Context是用于处理请求的上下文环境变量,用于处理http请求及相关数据返回。iris框架支持多种数据格式的返回,此处我们学习掌握返回string、json、xml以及html格式的数据。

3.3.1 返回string类型数据
context.WriteString("hello world")
3.3.2 返回json格式的数据
context.JSON(iris.Map{"message": "hello word", "requestCode": 200})
3.3.3 返回xml格式的数据
context.XML(Person{Name: "Davie", Age: 18})
3.3.4 返回html格式数据
context.HTML("<h1> Davie, 12 </h1>")

通过本节课的内容,我们学习了iris框架中的不同类型的数据请求以及返回不同的数据格式。

四 路由功能处理方式

4.1 Context概念

Context是iris框架中的一个路由上下文对象,在iris框架中的源码路径定义为:{$goPath}\github.com\kataras\iris\context\context.go。以下是Context的声明和定义:

package context
type Context interface {
	BeginRequest(http.ResponseWriter, *http.Request)
	EndRequest()
	ResponseWriter() ResponseWriter
	ResetResponseWriter(ResponseWriter)
	Request() *http.Request
	SetCurrentRouteName(currentRouteName string)
	GetCurrentRoute() RouteReadOnly
	Do(Handlers)
	AddHandler(...Handler)
	SetHandlers(Handlers)
	Handlers() Handlers
	HandlerIndex(n int) (currentIndex int)
	Proceed(Handler) bool
	HandlerName() string
	Next()
	NextOr(handlers ...Handler) bool
	NextOrNotFound() bool
	NextHandler() Handler
	Skip()
	StopExecution()
	IsStopped() bool
	Params() *RequestParams
	Values() *memstore.Store
	Translate(format string, args ...interface{}) string
	Method() string
	Path() string
	RequestPath(escape bool) string
	Host() string
	Subdomain() (subdomain string)
	IsWWW() bool
	RemoteAddr() string
	GetHeader(name string) string
	IsAjax() bool
	IsMobile() bool
	Header(name string, value string)
	ContentType(cType string)
	GetContentType() string
	GetContentLength() int64
	StatusCode(statusCode int)
	GetStatusCode() int
	Redirect(urlToRedirect string, statusHeader ...int)
	URLParamExists(name string) bool
	URLParamDefault(name string, def string) string
	URLParam(name string) string
	URLParamTrim(name string) string
	URLParamEscape(name string) string
	View(filename string, optionalViewModel ...interface{}) error
	Text(text string) (int, error)
	HTML(htmlContents string) (int, error)
	JSON(v interface{}, options ...JSON) (int, error)
	JSONP(v interface{}, options ...JSONP) (int, error)
	XML(v interface{}, options ...XML) (int, error)
	Markdown(markdownB []byte, options ...Markdown) (int, error)
	......

在该Context的接口定义中,我们可以发现,包含很多处理请求及数据返回的操作。在iris框架内,提供给开发者一个ContextPool,即存储上下文变量Context的管理池,该变量池中有多个context实例,可以进行复用。每次有新请求,就会获取一个新的context变量实例,来进行请求的路由处理。我们在实际的案例学习中,会向大家展示关于Context的相关用法。

4.2 正则表达式路由

Iris框架在进行处理http请求时,支持请求url中包含正则表达式。
正则表达式的具体规则为:

  • 1、使用{}对增则表达式进行包裹,url中出现类似{}样式的格式,即识别为正则表达式
  • 2、支持自定义增则表达式的变量的命名,变量名用字母表示。比如:{name}
  • 3、支持对自定义正则表达式变量的数据类型限制,变量名和对应的数据类型之间用“:”分隔开。比如:{name:string}表示增则表达式为name,类型限定为string类型
  • 4、通过context.Params()的Get()和GetXxx()系列方法来获取对应的请求url中的增则表达式的变量
  • 5、增则表达式支持变量的数据类型包括:string、int、uint、bool等。

如下是正则表达式的请求示例:

app.Get("/api/users/{isLogin:bool}", func(context context.Context) {
	isLogin, err := context.Params().GetBool("isLogin")
	if err != nil {
		context.StatusCode(iris.StatusNonAuthoritativeInfo)
		return
	}
	if isLogin {
		context.WriteString(" 已登录 ")
	} else {
		context.WriteString(" 未登录 ")
	}
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1387492.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《新课程教学》(电子版)是正规期刊吗?能评职称吗?

《新课程教学》&#xff08;电子版&#xff09;主要出版内容为学科教学理论、学科教学实践经验和成果&#xff0c;主要读者对象为中小学教师&#xff0c;期刊设卷首语、名家讲堂、课程与教学、教学实践、考试评价、教育信息化、教学琐谈、教育管理、教师心语、一线课堂、重温经…

高通sm7250与765G芯片是什么关系?(一百八十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

idea写sql语句快捷键提醒,mapper注解开发,mybatis

第一步&#xff1a;注入SQL语言 1.显示上下文操作&#xff08;没有这个选项的话就选中sql然后直接alt回车快捷键&#xff09;2.注入语言或引用 3.mysql 第二步&#xff1a;配置MySQL数据库连接 1.首先点击侧边的数据库&#xff0c;再点击上面的加号 2.点击数据源&#xff…

不可不知的网络信息安全隐患

随着互联网的普及和信息技术的飞速发展&#xff0c;网络安全问题日益凸显。网络攻击、网络诈骗、网络病毒等问题时刻威胁着人们的隐私和财产安全。 1.黑客攻击黑客攻击是网络信息安全面临的最大威胁之一。 一是及时更新服务器系统安全漏洞补丁&#xff1b;二是要加强服务器安全…

显示CPU架构的有关信息 lscpu

文章目录 显示CPU架构的有关信息 lscpu默认实例更多信息 显示CPU架构的有关信息 lscpu Linux的CPU设备查看器。lscpu命令用来显示cpu的相关信息。 lscpu从sysfs和/proc/cpuinfo收集cpu体系结构信息&#xff0c;命令的输出比较易读 。 命令输出的信息包含cpu数量&#xff0c;线…

高级分布式系统-第15讲 分布式机器学习--联邦学习

高级分布式系统汇总&#xff1a;高级分布式系统目录汇总-CSDN博客 联邦学习 两种常见的架构&#xff1a;客户-服务器架构和对等网络架构 联邦学习在传统的分布式机器学习基础上的变化。 传统的分布式机器学习&#xff1a;在数据中心或计算集群中使用并行训练&#xff0c;因为…

排序——计数排序

文章目录 概念思路绝对映射&#xff1a;相对映射 代码实现特性结果演示 概念 计数排序是一个非基于比较的排序算法&#xff0c;该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时&#xff0c;它的复杂度为Ο(nk)&#xff08;其中k是整数的范围…

QT-day6

作业1&#xff1a;数据库增删查改 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);if (!db.contains("stu.db")){db QSqlDatabase::addDatabase(&q…

能耗监测系统在某大型公共建筑的研究与应用——安科瑞赵嘉敏

摘要 大型公共建筑总面积不足城镇建筑总面积的4%&#xff0c;但总能耗却占全国城镇总耗电量的22%&#xff0c;大型公共建筑单位面积年耗电量达到70&#xff5e;300KWh&#xff0c;为普通居民住宅的10&#xff5e;20倍。公共建筑是节能大户&#xff0c;做好公共建筑节能工作&am…

力扣 | 49. 字母异位词分组

这里使用HashMap Java package _49;import java.util.*;public class Problem_49_GroupAnagrams {public List<List<String>> groupAngrams(String [] strs){Map<String,List<String>> map new HashMap<>(); // int [] arr new int[]{}…

国科大软件安全原理期末复习笔记

1 软件安全总论 1.软件的三大特性&#xff1a;复杂性、互连性、可扩展性&#xff1b; 2.基本概念&#xff1a;缺陷、漏洞、风险 缺陷&#xff08;bug&#xff09;&#xff1a;软件在设计和实现上的错误&#xff1b;漏洞&#xff08;vulnerability&#xff09;&#xff1a;漏洞…

车厢重组#洛谷

题目描述 在一个旧式的火车站旁边有一座桥&#xff0c;其桥面可以绕河中心的桥墩水平旋转。一个车站的职工发现桥的长度最多能容纳两节车厢&#xff0c;如果将桥旋转 180 180 180 度&#xff0c;则可以把相邻两节车厢的位置交换&#xff0c;用这种方法可以重新排列车厢的顺序…

基于springboot体育场馆运营管理系统源码

基于springboot体育场馆运营管理系统源码330 -- MySQL dump 10.13 Distrib 5.7.31, for Linux (x86_64) -- -- Host: localhost Database: springboot3cprm -- ------------------------------------------------------ -- Server version 5.7.31/*!40101 SET OLD_CHARACT…

使用numpy处理图片——图片切割

大纲 上下切分左右切分代码地址 在《使用numpy处理图片——滤镜》和《用numpy处理图片——模糊处理》中&#xff0c;我们认识到对三维数组使用dsplit方法按第3维度&#xff08;深度&#xff09;方向切分的方法。 本文我们将介绍如何进行第一和第二维度切分&#xff0c;来达到图…

matlab|基于VMD-SSA-LSTM的多维时序光伏功率预测

目录 1 主要内容 变分模态分解(VMD) 麻雀搜索算法SSA 长短期记忆网络LSTM 2 部分代码 3 程序结果 4 下载链接 1 主要内容 之前分享了预测的程序基于LSTM的负荷和可再生能源出力预测【核心部分复现】&#xff0c;该程序预测效果比较好&#xff0c;并且结构比较清晰&#…

VMware workstation安装Fedora-Server-39-1.5虚拟机并配置网络

VMware workstation安装Fedora-Server-39-1.5虚拟机并配置网络 Fedora包含的软件以自由及开放源码许可来发布&#xff0c;并旨在成为该技术领域的领先者。Fedora在专注创新、抢先集成新技术、与上游Linux社区紧密工作方面拥有良好名声。该文档适用于在VMware workstation平台安…

什么是CNV?

CNV&#xff08;拷贝数变异&#xff09;是基因组遗传学中的一个术语&#xff0c;指的是在个体的DNA序列中与参考基因组相比存在的基因或DNA片段的拷贝数增加或减少。 这些变异可以涉及很小的DNA片段&#xff0c;也可能涉及数百个基因。CNV是基因组多样性的一个重要组成部分&…

10万字208道软件测试经典面试题总结(附答案)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;获取《10万字208道软件测试经典面试总结&#xff08;附答案&#xff09;》pdf&#xff0c;背题更方便&#xff0c;一文在手&#xff0…

window系统安装MySQL -- MySQL(1)

第一步&#xff1a; 下载mysql安装包 1&#xff09;打开MySQL官方链接&#xff1a;https://www.mysql.com 2&#xff09;选择 DOWNLOADS 3&#xff09;往下滑&#xff0c;点击社区版本下载 4&#xff09;点击 MySQL installer for Windows 5&#xff09;点击安装 第二步&#…

MySQL的单表查询

单表查询的素材&#xff1a; 一、单表查询 素材&#xff1a; 表名&#xff1a;worker-- 表中字段均为中文&#xff0c;比如 部门号 工资 职工号 参加工作 等 CREATE TABLE worker ( 部门号 int(11) NOT NULL, 职工号 int(11) NOT NULL, 工作时间 date NOT NULL, 工资 floa…