Xenolies

Welcome to Xenolies Blog !

Linux 基础

什么是 Linux Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux有上百种不同的发行版,如基于社区开发的debian、archlinux,和基于商业开发的Red Hat Enterprise Linux、SUSE、Oracle Linux等。 安装 Linux 这里使用的环境是 Windows 自带的 Linux 子系统 (WSL2), Ubuntu 版本 1804. 可以参考微软官方的安装教程 安装 WSL | Microsoft Learn 注意的是,如果直接从微软商店(Microsoft Store)安装会默认安装的 C 盘,导致使用不便. 建议下载发行版的离线安装包,然后将后缀改为 zip,解压到你想要的位置上面,接着运行可执行文件(exe),安装 Linux. Linux 目录结构 Linux 的目录结构是一个树型结构. Windows 系统可以拥有多个盘符,如 C 盘、D 盘、E 盘. Linux 没有盘符这个概念,只有一个顶级目录: 根目录( / ), 所有文件都在它下面. 所以 Linux 的目录描述起来就是 /home/user , 而 Windows 就是 D:\Ubuntu_1804.2019.522.0_x64 在 Linux 中 / 在开头表示根目录,在后面的表示一个层级关系, 比如前面的 : /home/user 中, / 表示根目录,home/user 表示 根目录 下 home 文件夹下的 user 文件夹.

Go-Zero 框架入门

环境配置 Goctl 环境配置 Goctl 介绍 goctl 是 go-zero 微服务框架下的代码生成工具。使用 goctl 可显著提升开发效率,让开发人员将时间重点放在业务开发上。 其功能有: api服务生成 rpc服务生成 model代码生成 模板管理 Goctl安装 方法1 Go get安装 1 2 3 4 5 # Go 1.15 及之前版本 GO111MODULE=on GOPROXY=https://goproxy.cn/,direct go get -u github.com/zeromicro/go-zero/tools/goctl@latest # Go 1.16 及以后版本 GOPROXY=https://goproxy.cn/,direct go install github.com/zeromicro/go-zero/tools/goctl@latest (windows可以下载64位或者32位的发行版,然后放到$GOPATH/bin 目录下,然后将其添加到环境变量中) 方法2 从 go-zero代码仓库 git@github.com:zeromicro/go-zero.git 拉取一份源码,进入 tools/goctl/目录下编译一下 goctl 文件,然后将其添加到环境变量中。 安装完成后 goctl -v ,如果输出版本信息则代表安装成功,例如: 1 2 $ goctl -v goctl version 1.4.3 windows/amd64 如果显示没找到,请确认是否配置了环境变量 环境测试 值得注意的是在 1.4.3 版本的 Goctl直接使用go run greet.

Golang派生类型

Golang派生类型 (指针类型(Pointer) 数组类型 (Arrayllist) 结构化类型 (Struct) 通道类型 (Channel ) 函数类型(Func) 切片类型 (Slice) 接口类型(Interface) Map 类型 指针 Pointer 声明指针 1 var Name *Type Name :指针名 Type: 指针类型 注意: 指针需要指向的是一个具体的地址 声明地址需要在要声明的变量前面加 & 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 package main import "fmt" func main() { var a int = 10 fmt.Println(a) var b *int b = &a //指针b 指向 a 的地址 *b = 100 //将 b 指向的内存地址赋为 100 fmt.

Golang 操作数据库

数据库连接和驱动 安装数据库驱动包 1 go get -u github.com/go-sql-driver/mysql 导入数据驱动 1 2 3 4 5 import ( "database/sql" _ "github.com/go-sql-driver/mysql" //引用包内部分函数 ) sql.DB 结构体 sql.DB结构是sql/database包封装的一个数据库操作对象,包含了操作数据库的基本方法。 DSN DSN全称为Data Source Name,表示数据库连来源,用于定义如何连接数据库,不同数据库的DSN格式是不同的,这取决于数据库驱动的实现, 下面是 go-sql-driver/sql 的DSN格式: 1 2 //[用户名[:密码]@][协议(数据库服务器地址)]]/数据库名称?参数列表 [username[:password]@][protocol[(address)]]/dbname[?param1=value1&...&paramN=valueN] 连接数据库 在 sql/database包中.使用 sql.Open来连接数据库,值得注意的是 sql.Open 这样连接不会验证密码和账户是否正确,数据库是否存在,只会校验 DSN 格式. 1 2 3 4 5 6 7 8 9 drever := "mysql" //root为数据库用户名,后面为密码,tcp代表tcp协议,test处填写自己的数据库名称 DSN := "root:123123@tcp(127.0.0.1:3306)/godatabase?charset=utf8" db, err := sql.Open(drever, DSN) if err != nil { //不会校验用户名密码是否正确,只校验数据源格式 fmt.Printf("sql.Open err: %v", err) //dsn格式不正确时报错 return } 验证账号密码以及要连接的数据库是否正确 使用 sql.

Golang并发编程

Go 语言支持并发,我们只需要通过 go 关键字来开启 goroutine 即可。 goroutine 是轻量级线程,goroutine 的调度是由 Golang 运行时进行管理的。 并行和并发 并行:在同一时刻,有多条指令在多个CPU处理器上同时执行 2个队伍,2个窗口,要求硬件支持 并发:在同一时刻,只能有一条指令执行,但多个进程指令被快速地轮换执行 2个队伍,1个窗口,要求提升软件能力 Go语言并发优势 go从语言层面就支持了并发 简化了并发程序的编写 Goroutine Goroutine 是go并发设计的核心 Goroutine 就是协程,它比线程更小,十几个Goroutine 在底层可能就是五六个线程 go语言内部实现了Goroutine e的内存共享,执行Goroutine 只需极少的栈内存(大概是4~5KB) 使用Goroutine 1 go 函数名( 参数列表 ) 使用如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 package main import ( "fmt" "time") func running() { var times int // 构建一个无限循环 for { times++ fmt.

Golang网络编程

协议 协议可以理解为规则,是数据传输和解释的规则,是通信双方都要遵守的规则。 协议存在的意义是为了让双方更好的沟通。 在双方之间被遵守的协议成为原始协议。 当此协议被更多的人采用后,不断的完善,最终形成一个稳定的、完整的文件传输协议,被广泛应用于各种文件传输过程中。该协议就成为了一个标准协议。 网络应用模型 C/S模型 : 需要在服务器端和客户端都安装部署,才能完成数据通信。性能好,因为可以提前把数据缓存到客户端本地,提高用户体验,限制也少,可采用的协议相对灵活。 B/S模型:只需要在服务器端安装部署,客户端只需要一个浏览器即可。优势是移植性非常好,不收平台限制,只需一个浏览器就可以打开。缺点是无法想C/S那样提前缓存大量数据在本地,网络受限时,应用的体验感非常差,而且浏览器采用的协议是标准http协议通信,没有C/S灵活 . 标准库net包基本使用 TCP编程 net库是Golang原生自带标准库,无需第三方包来支持网络功能。 服务器端基本代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 package main import ( "fmt" "net" ) func main() { listener, err := net.Listen("tcp", "10.205.6.142:8088") if err != nil { fmt.Printf("net.Listen error: %v", err) return } fmt.
0%