golang

golang操作mysql使用总结

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-12 13:34:53
前言 Golang 提供了database/sql包用于对sql数据库的访问,作为操作数据库的入口对象sql.DB,主要为我们提供了两个重要的功能: sql.DB通过为数据库驱动为我们提供管理底层数据库连接的打开和关闭操作 sql.DB为我们管理数据库连接池 需要注意的是,sql.DB表示操作数据库的抽象访问接口,而非一个数据库连接对象;它可以根据driver打开关闭数据库连接,管理连接池。正在使用的连接被标记为繁忙,用完后回到连接池等待下次使用。所以,如果你没有把连接释放回连接池,回导致过多连接使系统资源耗尽 操作mysql 1.导入mysql数据库驱动 import ( "database/sql" _ "github.com/go-sql-driver/mysql" ) 通常来说, 不应该直接使用驱动所提供的方法, 而是应该使用 sql.DB, 因此在导入 mysql 驱动时, 这里使用了匿名导入的方式(在包路径前添加 _), 当导入了一个数据库驱动后, 此驱动会自行初始化并注册自己到Golang的database/sql上下文中, 因此我们就可以通过 database/sql 包提供的方法访问数据库了. 2.连接数据库 type DbWorker struct { //mysql data source name Dsn string } func main ( ) {

Golang 切片

房东的猫 提交于 2019-12-11 18:32:24
一个切片(slice) 是一个数组某个部分的引用。 1、切片初始化 (1)、通过内置函数make初始化: slice := make([]Type,len,[cap]) []Type,某种类型的数组; Len 表示切片数据长度; Cap 表示切片容量,cap >= len,该参数可选,默认cap=len 例如: slice := make([]string,5) //初始化一个字符串类型的切片,长度和容量均为5 slice := make([]string,5,10) //初始化一个字符串类型的切片,长度为5,容量为10 (2)、通过现有数组来初始化 slice := arr[startIndex:endIndex] //startIndex,endIndex可选,startIndex默认为0,endIndex默认为arr长度,取得的数组下标是[startIndex:endIndex) 左闭右开区间 例如: arr := […]string{"aaa","bbb","ccc","ddd"} slice := arr[1:4] //[1:4) 共3个元素创建一个切片 slice := arr[:4] //[0:4) 共4个元素创建一个切片 slice := arr[1:] //[1:len(arr)) slice := arr[:] //[0:len(arr))

Golang结构体值的交换

五迷三道 提交于 2019-12-11 16:18:14
Golang结构体值的交换 一、最初的做法 最先遇到这个问题是在比编写PUT方法的接口时遇到。 解决方法是增加一个Input struct,该struct字段的变量都为原结构体的指针类型。 优点 :可以根据业务逻辑做出改变。 缺点 :冗余、易错(每次测试PUT方法时,需要特别小心)。 代码如下: type Student struct { ID string `json:"id" Name string `json:"name" Age int `json:"age" } type StudentInput struct { ID *string `json:"id" ` Name *string `json:"name"` Age *int `json:"age" ` } func Handle() { var source Student var input StudentInput ...... if input.Name != nil { source.Name = *input.Name } ...... } 二、升级版本 最近看了波罗学大佬的一篇 文章 ,突发奇想,可以使用Go的反射实现交换struct中的值。 类似的作品就想到了开源的 mapstruct ,参考了一下源码,写了一个劣质Demo。 代码如下: func Swap(source, input

golang数据结构之利用栈求计算表达式(加减乘除)

柔情痞子 提交于 2019-12-11 16:14:50
例如:3+2*6-2 先定义两个栈,一个为数值栈,一个为运算符栈; stack.go package stack import ( "errors" "fmt" ) type Stack struct { MaxTop int //栈最大可以存放的数量 Top int //栈顶 Arr [20]int //模拟栈 } func (s *Stack) Push(val int) (err error) { //先判断栈是否满了 if s.Top == s.MaxTop-1 { fmt.Println("栈满了") return errors.New("栈满了") } s.Top++ s.Arr[s.Top] = val return } func (s *Stack) Pop() (val int, err error) { if s.Top == -1 { fmt.Println("栈已空") return -1, errors.New("栈已空") } val = s.Arr[s.Top] s.Arr[s.Top] = 0 s.Top-- return val, nil } func (s *Stack) Show() { if s.Top == -1 { fmt.Println("栈为空") return } tmp := s for i := tmp.Top; i >= 0;

Golang中间件【转】

戏子无情 提交于 2019-12-11 15:48:16
本章将对现在流行的 web 框架中的中间件技术原理进行分析,并介绍如何使用中间件技术将业务和非业务代码功能进行解耦。 代码泥潭 先来看一段代码: // middleware/hello.go package main func hello(wr http.ResponseWriter, r *http.Request) { wr.Write([]byte("hello")) } func main() { http.HandleFunc("/", hello) err := http.ListenAndServe(":8080", nil) ... } 这是一个典型的 web 服务,挂载了一个简单的路由。我们的线上服务一般也是从这样简单的服务开始逐渐拓展开去的。 现在突然来了一个新的需求,我们想要统计之前写的 hello 服务的处理耗时,需求很简单,我们对上面的程序进行少量修改: // middleware/hello_with_time_elapse.go var logger = log.New(os.Stdout, "", 0) func hello(wr http.ResponseWriter, r *http.Request) { timeStart := time.Now() wr.Write([]byte("hello")) timeElapsed := time

Unicode UTF-8与GB18030编码解析(golang)

主宰稳场 提交于 2019-12-11 13:36:32
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 最早接触到编码问题时,无非是关于『乱码』一词,当某个程序或者网页或者数据库或者IDE中一看出现了乱码,就马上知道这是字符编码与解码不匹配,改下编码就好,就因为这个事情太简单,容易解决,甚至在一段时间看到一段乱码文字形状,就知道这肯定是xxx编码转为yyy编码存储然后又用xxx来显示导致的。。。 从来没有去纠结到底为什么有这么多编码,到底为何需要转换?是怎么转换的?如何转换?为什么都通用utf-8还有很多新项目在用GBK呢? 折腾了1个晚上,我明白了。。。以下我都用我自己理解的语言来描述下,分享下 ASCII编码 美国人发明计算机,美国人用八位表示1字节,8位的数据可以有2 8 =256 种状态描述事物。首先他添加进去了26个字母包括大小写,然后标点符号,换行符...然后用掉了128个,把这种做法取了个很吊名字叫『Ascii』,是『美国信息互换标准代码』的缩写。这也是我们小时候学习计算机的Ascii码表,当时貌似在C语言课本附录里面。 打印一个字符的Ascii码很简单 fmt.Printf("%d", 'A') GB系列编码 很明显,这个American Standard 从未考虑中国人的感受,你可以显示字母就完事了,中国的国粹汉字咋整?所以在中国的一群人开始做自己的编码,那是在1980年,做出来的是GB

golang 中的字符类型

≯℡__Kan透↙ 提交于 2019-12-11 13:32:09
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> golang 把字符类型单独分离出来, 并且使用了不同的语法: var char = '这' 而用 fmt.Printf("%T", char) 查看其类型, 竟然是 int32 这让人奇怪, 通常字符组成了字符串, 字符串如果只有一个字符长度的话, 应当就是字符. 但 golang 的做法改变了这种通常的观点: 字符是数字类型, 如果要合并一个字符到字符串中, 该怎么办呢? str := string(char) golang 预定义了 rune, byte 两种和字符有关的类型,但在显示的时候, 却改了名字: var x byte fmt.Printf("x is %T", x) // x is int8 var y rune fmt.Printf("y is %T", y) // y is int32 这似乎没有必要定义这两种类型, 因为 golang 自己的内置函数根本就忽略了它. 另外 golang 和字符串有关的类型也比较混乱, 有 string, []byte, []rune. 和 string 有关的 strings 模块的输入数据类型大部分是 []string. 而由此引发的数据流就更加混乱, 读出的字符串有各种格式. 不过 golang 提供了内置函数对这些数据类型进行相互转换: var

ubuntu16安装golang和goland

瘦欲@ 提交于 2019-12-11 05:40:24
ubuntu安装go语言 至此,上面的win下安装go就作废了,需要在ubuntu上安装go,过程如下: 先下载安装包 https://golang.google.cn/dl/ ,选择Linux版本的安装包 go1.13.5.linux-amd64.tar.gz 在下载目录下打开命令行,将安装包解压到目录/usr/local下, sudo tar -C /usr/local -xzf go1.4.linux-amd64.tar.gz 注意需要事先取得root权限(使用命令su),否则解压时没有权限创建go文件夹。 将 /usr/local/go/bin 目录添加至PATH环境变量: export PATH = $PATH :/usr/local/go/bin 验证安装: go version 安装成功 参考菜鸟教程 https://www.runoob.com/go/go-environment.html ubuntu安装goland go语言全称是golang goland是go语言的IDE 安装过程: 下载Linux版的安装包:https://www.jetbrains.com/go/download/#section=linux 进入下载目录,然后将安装包解压到 /usr/local 目录下 sudo tar -C /usr/local -xzf goland-2019.3

ubuntu16.10上部署golang1.7.4

夙愿已清 提交于 2019-12-10 22:15:40
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 因为之前一直在win下开发,所以直接下载安装就解决问题了。最近为了测试项目在ubuntu下运行状况,特别研究了ubuntu的部署方法,把具体步骤和遇到的问题记下,方便以后查阅。 安装方法 1、去golang官方下载最新版的goxx.linux-amd64.tar.gz。这里也可以到 http://www.golangtc.com 下载,地址是: http://www.golangtc.com/download 。 2、下载后将压缩包解压到任意路径,这里以" /etc/go "为例。 3、进入$HOME目录,建立如下目录: $HOME/gosrc 4、在终端,输入命令,建立系统路径: # 打开profile文件 vim .profile # 指定go相关目录 export GOROOT=/etc/go export GOPATH=$HOME/gosrc export GOBIN=$GOROOT/bin export PATH=$PATH:$GOROOT/bin # 保存并关闭文件 5、保存并关闭文件,之后执行: source .profile 6、本次终端已经生效了,如果是桌面版,则需要将用户注销重新登录才会生效,因为profile文件是每次登录的时候自动执行的。 7、使用go env检查go安装情况。 FAQ

Golang---序列化和反序列化

你说的曾经没有我的故事 提交于 2019-12-10 22:09:13
为什么要序列化和反序列化   我们的数据对象要在网络中传输或保存到文件,就需要对其编码和解码动作,目前存在很多编码格式:json, XML, Gob, Google Protocol Buffer 等, Go 语言当然也支持所有这些编码格式。 序列化与反序列化   序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。通过从存储区中读取对象的状态,重新创建该对象,则为反序列化 序列化和反序列化规则 Go类型 json 类型 bool booleans float64 numbers string strings nil null 在解析 json 格式数据时,若以 interface{} 接收数据,需要按照以上规则进行解析。 代码演示 package mainimport ( "encoding/json" "fmt")type People struct { name string `json:"name"` // name,小写不导出 Age int `json:"age"` // age Gender string `json:"gender"` // gender Lesson}type Lesson struct { Lessons []string `json:"lessons"