
Golang
Golang 相关知识点
李培冠
欢迎访问个人网站: https://lpgit.com
展开
-
【Golang 报错】exec gcc executable file not found in %PATH%
在 import sqlite3 的时候,golang build 出现以下错误:exec: “gcc”: executable file not found in %PATH%原因是 sqlitle3是个 cgo库,需要 gcd编译 c 代码需要下载安装 mingw:https://sourceforge.net/projects/mingw-w64/files/mingw-w64/我选择的是:MinGW-W64-install.exe,也可以下载其他类型。下载安装完之后,记得添加环境变量:原创 2021-04-17 13:32:48 · 1364 阅读 · 0 评论 -
租房项目 获取地区信息服务
流程接口# Request: method: GETurl: api/v1.0/areas# data:no input data# Response:# 返回成功{ "errno": 0, "errmsg": "ok", "data": [ {"aid": 1, "aname": "东城区"}, {"aid": 2, "aname": "西城区"}, ... ]} # 返回失败{原创 2020-08-26 15:39:41 · 8348 阅读 · 0 评论 -
租房项目 启动前的处理
项目启动拆分原则1、单一职责(一个服务只做一件事)2、服务粒度适中3、考虑团队结构4、以业务模型切入5、演进式拆分6、避免环形依赖和双向依赖如果还没有安装 beego 的话先安装 beego$ go get -u -v github.com/astaxie/beego$ go get -u -v github.com/beego/bee$ cd $GOPATH/src/github.com/beego/bee$ go build$ sudo mv bee /bin/服务发现的启原创 2020-08-24 21:46:29 · 9639 阅读 · 0 评论 -
golang 两个go程轮流打印一个切片
问题描述:两个 go 程轮流打印一个切片。Golang 实现:package mainimport ( "fmt" "sync")// 两个 go 程轮流打印一个切片func main() { ch1 := make(chan bool, 1) ch2 := make(chan bool, 1) ch1 <- true nums := []int{1, 2, 3, 4, 5, 6, 7, 8, 9} var i int var wg sync.WaitGroup w原创 2020-08-21 10:25:18 · 9777 阅读 · 1 评论 -
golang 拷贝大切片一定比小切片代价大吗
问题描述拷贝大切片一定比小切片代价大吗?解答并不是,拷贝所有切片的代价都是一样的。看一下源码,就很清楚了:type slice struct { array unsafe.Pointer len int cap int}因为切片的底层有三个字段(一个 unsafe.Pointer,两个 int)。其中 unsafe.Pointer 指向的是切片底层数组的指针,这是切片的存储空间,第二个字段是切片的长度,第三个字段是切片的容量。将一个切片变量分配给另一个变量只会复制三个机器字原创 2020-08-19 21:30:17 · 9899 阅读 · 0 评论 -
golang 如何翻转含有中文 数字 英文字母等任意字符串
问题描述翻转含有 中文、数字、英文字母 等任意字符串示例输入:"he師l發lo,世。+-*界,6"输出:"6,界*-+。世,ol發l師eh"Golang 实现package mainimport "fmt"func reverseString(s string) string { // 将字符串转换为 rune 类型的切片,并对该切片翻转 res := reverse([]int32(s)) // 再把 rune 类型的切片转为 string return string(res原创 2020-08-19 09:40:51 · 9684 阅读 · 0 评论 -
在 Go 1.15 中 var i interface{} = 3 会有额外堆内存分配吗
首先先说一下结论, 在最新版本 Go 1.15 中, 在 runtime 部分中提到了一个改进:Converting a small integer value into an interface value no longer causes allocation.意思是说,将小整数转换为接口值不再需要进行内存分配。小整数是指 0 到 255 之间的数。那么这个是怎么实现的呢?具体的代码在这里: runtime: prevent allocation when converting small i原创 2020-08-16 10:16:30 · 8877 阅读 · 0 评论 -
Golang 锁和条件变量
前言前面我们为了解决go程同步的问题我们使用了channel, 但是go也提供了传统的同步工具.它们都在go的标准库代码包 sync 和 sync/atomic 中.下面我们来看一下锁的应用.什么是锁呢? 就是某个协程(线程)在访问某个资源时先锁住, 防止其他协程的访问, 等访问完毕解锁后其他协程再来加锁进行访问.这和我们生活中加锁使用公共资源相似, 例如: 公共卫生间.死锁死锁是指两个或者两个以上的进程在执行过程中, 由于竞争资源或者由于彼此通信而造成的一种阻塞的现象, 若无外力作用, 它们原创 2020-08-07 12:10:00 · 15067 阅读 · 1 评论 -
Golang select
select的作用Go里面提供了一个关键字 select, 通过 select 可以监听channel上的数据流动.select 的用法与 switch 语言非常类似, 由 select 开始一个新的选择块, 每个选择条件由 case 语句来描述.与 switch 语句相比, select 有比较多的限制, 其中最大的一条限制就是每个case语句里必须是一个IO操作.大致的结构如下:select {case <- chan1: // 如果chan1成功读到数据, 则进行该case处理语句原创 2020-08-04 11:20:15 · 10432 阅读 · 1 评论 -
Golang sync.WaitGroup
Go语言中除了可以使用通道(channel)和互斥锁进行两个并发程序间的同步外,还可以使用等待组进行多个任务的同步,等待组可以保证在并发环境中完成指定数量的任务在 sync.WaitGroup(等待组)类型中,每个 sync.WaitGroup 值在内部维护着一个计数,此计数的初始默认值为零。等待组有下面几个方法可用,如下所示。func (wg *WaitGroup) Add(delta int): 等待组的计数器 +1func (wg *WaitGroup) Done(): 等待组的计数器 -1原创 2020-08-04 11:18:11 · 10069 阅读 · 0 评论 -
Golang channel
简介channel 是 Go 语言中的一个核心类型,可以把它看成管道。并发核心单元通过它就可以发送或者接收数据进行通讯,这在一定程度上又进一步降低了编程的难度。channel 是一个数据类型,主要用来解决 go 程的同步问题以及 go 程之间数据共享(数据传递)的问题。goroutine 运行在相同的地址空间,因此访问共享内存必须做好同步。goroutine 奉行通过通信来共享内存,而不是共享内存来通信。引⽤类型 channel 可用于多个 goroutine 通讯。其内部实现了同步,确保并发安全(原创 2020-08-04 11:17:42 · 10500 阅读 · 0 评论 -
Golang Goroutine
什么是 Goroutinegoroutine 是 Go 并行设计的核心。goroutine 说到底其实就是协程,它比线程更小,十几个 goroutine 可能体现在底层就是五六个线程,Go 语言内部帮你实现了这些 goroutine 之间的内存共享。执行 goroutine 只需极少的栈内存(大概是4~5KB),当然会根据相应的数据伸缩。也正因为如此,可同时运行成千上万个并发任务。goroutine 比 thread 更易用、更高效、更轻便。一般情况下,一个普通计算机跑几十个线程就有点负载过大了,但是原创 2020-08-04 11:17:09 · 9610 阅读 · 0 评论 -
Golang 并发编程
前言简而言之,所谓并发编程是指在一台处理器上“同时”处理多个任务。随着硬件的发展,并发程序变得越来越重要。Web服务器会一次处理成千上万的请求。平板电脑和手机app在渲染用户画面同时还会后台执行各种计算任务和网络请求。即使是传统的批处理问题–读取数据,计算,写输出–现在也会用并发来隐藏掉I/O的操作延迟以充分利用现代计算机设备的多个核心。计算机的性能每年都在以非线性的速度增长。宏观的并发是指在一段时间内,有多个程序在同时运行。并发在微观上,是指在同一时刻只能有一条指令执行,但多个程序指令被快速的轮换原创 2020-08-04 10:58:37 · 10217 阅读 · 0 评论 -
Golang 指针
指针是一个代表着某个内存地址的值, 这个内存地址往往是在内存中存储的另一个变量的值的起始位置.Go语言对指针的支持介于Java语言和 C/C++ 语言之间, 它既没有像Java那样取消了代码对指针的直接操作的能力, 也避免了 C/C++ 中由于对指针的滥用而造成的安全和可靠性问题.指针地址和变量空间Go语言保留了指针, 但是与C语言指针有所不同. 主要体现在:默认值: nil.操作符 & 取变量地址, * 通过指针访问目标对象.不支持指针运算, 不支持 -> 运算符, 直接用 .原创 2020-08-04 10:58:04 · 10802 阅读 · 2 评论 -
Golang 结构体
前言结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体。每个值称为结构体的成员。用结构体的经典案例:学校的学生信息,每个学生信息包含一个唯一的学生学号、学生的名字、学生的性别、家庭住址等等。所有的这些信息都需要绑定到一个实体中,可以作为一个整体单元被复制,作为函数的参数或返回值,或者是被存储到数组中,等等。结构体也是值类型,因此可以通过 new 函数来创建。组成结构体类型的那些数据称为字段(fields)。字段有以下特性:字段拥有自己的类型和值。字段名必须唯一。字段的类型也可原创 2020-08-04 10:57:33 · 9362 阅读 · 0 评论 -
Golang map
前言哈希表是一种巧妙并且实用的数据结构。它是一个无序的 key/value对 的集合,其中所有的 key 都是不同的,然后通过给定的 key 可以在常数时间复杂度内检索、更新或删除对应的 value。在 Go 语言中,一个 map 就是一个哈希表的引用,map 类型可以写为 map[K]V,其中 K 和 V 分别对应 key 和 value。map 中所有的 key 都有相同的类型,所有的 value 也有着相同的类型,但是 key 和 value 之间可以是不同的数据类型。其中 K 对应的 key 必原创 2020-08-04 10:56:46 · 10052 阅读 · 0 评论 -
Golang 条件语句
在Go语言中,条件语句主要包括有if 、 switch 与 select。注意: Go语言中没有三目运算符,不支持 ?: 形式的条件判断。if 语句最简单的if语句最简单的 if 语句的基本语法:if 条件判断 { // 在当前条件判断为true时执行}条件判断如果为真(true),那么就执行大括号中的语句;如果为假(false),就不执行大括号中的语句,继续执行if结构后面的代码。**值得注意的是:**Go语言规定与 if 匹配的左括号 { 必须与 if和条件判断 放在同一行。原创 2020-08-04 10:53:20 · 8671 阅读 · 0 评论 -
Golang 运算符
运算符Go语言中常见的运算符有算术运算符, 赋值运算符, 关系运算符, 逻辑运算符等.算术运算符运算符描述示例结果+相加10 + 313-相减10 - 37*相乘10 * 330/相除10 / 33%取余10 % 31注意:自增( ++ )和自减( -- )在Go语言中是单独的语句, 并不是运算符, 也不是表达式.不允许不同类型进行相加。赋值运算符运算符描述示例=普通赋值, 将一个表原创 2020-08-04 10:52:47 · 10117 阅读 · 0 评论 -
Golang 常量
相对于变量, 常量是恒定不变的值, 经常用于定义程序运行期间不会改变的那些值.常量的定义使用常量的声明与变量的声明很相似, 只是把 var 换成了 const, 常量在定义的时候必须赋值.在程序开发中, 我们用常量存储一直不会发生变化的数据. 例如: Π, 身份证号码等. 像这类数据, 在整个程序运行中都是不允许发生改变的.package mainimport "fmt"func main(){ const pi float64 = 3.14159 // pi = 4.56原创 2020-08-03 19:24:12 · 8486 阅读 · 0 评论 -
Golang 占位符
我们前面在输出与输入字符串类型, 整数类型等都指定了对应的格式化.那么Go语言中还有哪些格式化呢?格式含义%%一个 % 字面量%b一个二进制整数值(基数为2), 或者是一个用科学计数法表示的指数为2的浮点数.%c字符型. 可以把输入的数字按照ASCII码相应的转换为对应的字符.%d一个十进制数值(基数为10).%e以科学记数法 e 表示的浮点数或者复数值%E以科学记数法 E 表示的浮点数或者复数值%f以标准计数法表示的浮点数或者复数值原创 2020-08-03 11:36:04 · 9565 阅读 · 0 评论 -
Golang 字符和字符串的区别
关于字符与字符串的区别:字符:单引号往往只包含一个字符, 转义字符除外: \n字符串:双引号字符串有一个或者多个字符组成字符串都是隐藏了一个结束符: \0下面通过代码来看一下两者的区别:package mainimport "fmt"func main() { var a byte = 'a' var b string = "a" // 'a' and '\0' 两个字符组成 fmt.Println(a) // 97 fmt.Println(b) // a原创 2020-08-02 18:59:29 · 8321 阅读 · 0 评论 -
Golang 基本数据类型
Go语言中有丰富的数据类型,除了基本的整型、浮点型、布尔型、字符串外,还有切片、结构体、函数、map、通道(channel)等。Go 语言的基本类型和其他语言大同小异。1. 整型整型可以分成以下两个大类:按长度分为:int8、int16、int32、int64对应的无符号整型:uint8、uint16、uint32、uint64其中,uint8 就是我们熟知的 byte 型.2. 浮点型Go语言支持两种浮点型数:float32、float64.注意:没有floatGo语言的原创 2020-08-02 11:17:34 · 9371 阅读 · 0 评论 -
Golang 输入
前面我们所写的程序, 都是直接给变量赋值. 但是在很多情况下, 我们希望用户通过键盘输入一个数值, 然后存储到某个变量中, 接着将该变量的值取出来, 进行操作.那么Go语言中怎么接收用户的键盘输入呢? 具体操作如下:第一种形式:fmt.Scanf()package mainimport "fmt"func main() { var age int fmt.Print("请输入你的年龄: ") fmt.Scanf("%d", &age) fmt.Printf("你的年龄为: %d原创 2020-08-02 11:16:16 · 9033 阅读 · 0 评论 -
Golang 输出
输出就是将数据信息打印到电脑屏幕上. 本节我们就来学习一下Go语言中的三种输出方式: fmt.Print()、fmt.Println()、fmt.Printf().fmt.Print()fmt.Print() 主要的一个特点就是打印数据时 不换行.package mainimport "fmt"func main() { a, b := 10, 20 // 输出: Print, 打印数据时不带换行 fmt.Print(a) fmt.Print(b)}原创 2020-08-02 11:15:41 · 8749 阅读 · 0 评论 -
Golang 变量
什么是变量?我们应该怎么去理解变量? 在这里我要举一个例子:大家应该都知道王者荣耀这个游戏. 当我们在玩王者荣耀的时候, 我们操控的英雄的血量是不断变化的, 这个血量是存在内存中的. 那么这个血量就是一个变量.在程序运行的过程中, 其值可以改变的量, 我们就称为变量.通过上面例子可以发现:变量是存储在内存中的变量的值是可以改变的我们说变量是存储在内存中, 那么内存又是什么呢?内存是一个连续的数据集合, 每一个内存存储区域都有一个唯一的地址标识, 称为内存地址. 就好比我们的身份证一样,原创 2020-08-02 10:58:00 · 7892 阅读 · 0 评论 -
Golang 命名规范
Go 语言中的函数名、变量名、常量名、类型名、语句标号和包名等所有的命名,都遵循一个简单的命名规则。必须以一个字母或者下划线(_)开头,后面可以跟任意数量的字母、数字或下划线。在 Go 语言中,大小写字母是不同的。Go 语言中有 25 个关键字,不能用于自定义名字:break default func interface selectcase defer go map struct原创 2020-08-02 10:57:23 · 8456 阅读 · 0 评论 -
Golang 注释
在上一节中, 我们学会了怎样写一个 Hello Go . 但是, 大家有可能还没有明白为什么那么写, 下面我们通过注释来了解一下.我们通过用自己熟悉的语言(例如,汉语),在程序中对某些代码进行标注说明,这就是注释的作用,能够大大增强程序的可读性。以后,在公司中做开发,其他程序员会经常阅读我们写的代码,当然,我们也会经常阅读别的程序员写的代码,如果代码中加了注释,那么阅读起来就非常容易了。一段不写注释的代码读起来实在难受. 那么 Go 语言的注释应该怎么写呢?1. 单行注释单行注释就是对代码中的一行原创 2020-08-02 10:55:31 · 11145 阅读 · 0 评论 -
Golang 第一个 Go 程序
本节我们来学习写一个最简单的 Go 程序: 打印 Hello Go.第一个Go程序, 只要跟着做, 留下个印象就可以.用 Goland 创建一个 hello_go.go 文件(后缀为 .go ). 文件内容是package mainimport "fmt"func main() { fmt.Println("Hello Go")}在 Goland 中使用快捷键 Ctrl + Shift + F10 运行程序, 结果如下:完美! 现在您已经学会怎样运行了一个Go程序了.李培冠博客原创 2020-08-02 10:54:32 · 7857 阅读 · 0 评论 -
Golang VS Code 配置 Go 语言开发环境
前言前面我已经讲过 GoLand 的安装,当然,你也可以使用 VS Code 来进行开发。VS Code 是微软开源的一款编辑器, 本文主要介绍如何使用VS Code搭建Go语言的开发环境.下载与安装VS Code官方下载地址: https://code.visualstudio.com/Download双击下载好的安装文件, 安装即可安装中文简体插件点击左侧菜单栏最后一项 管理扩展, 在 搜索框 中输入 chinese, 选中结果列表第一项, 点击 install 安装.安装完毕后右下角原创 2020-08-02 10:53:01 · 8023 阅读 · 0 评论 -
Golang Goland 的安装
前言前面我们已经将GO的环境安装好了,那么是否可以进行开发了呢?可以,但是为了能够更高效率的开发,我们还需要下载一个软件,该软件的作用就是方便我们能够快速的编写GO指令,快速的运行我们编写好的GO指令。这个软件就是 GoLand ,就像我们要处理文字安装 Word ,处理表格用 Excel 等等。我们把这种用来能够用来快速编写某种语言(GO,Python,JAVA,C#)指令,快速运行,同时如果出错可以方便我们查找错误(排错)的软件就称为IDE.IDE是什么IDE(Integrated Deve原创 2020-08-02 11:06:47 · 7997 阅读 · 0 评论 -
Golang 安装 Golang
前言前面已经对 GO 语言做了一个简单的介绍,相信大家也已经基本有所了解了,那么我相信大家迫不及待的想学习 GO 语言了,但是我们在具体学习 GO 语言前,需要先安装 GO 的开发环境。所谓的环境安装,就是将 GO 语言的指令都安装在你的电脑上,那么你在开发软件的时候就可以直接用了。GO 环境的安装分为 windows 系统的安装和 linux 系统的安装。下载地址Go 语言官网下载地址: https://golang.org/dl/Go 语言镜像站: https://golang.google.原创 2020-08-01 23:04:17 · 7651 阅读 · 0 评论 -
Golang Go 语言简介
1. Go语言是什么“Go 是一种开源的程序设计语言,它意在使得人们能够方便地构建简单、可靠、高效率的软件”(来自 go 官网 golang.org)Go 语言是 Google 开发的开源编程语言,于 2006年1月2日15点4分5秒 诞生,2009年11月 开源,2012年发布 go 稳定版。go 的主要目标是“兼具 Python 等动态语言的开发速度和 C/C++ 等编译型语言的性能与安全性”。我们程序员在开发程序,开发软件时都会选择一门编程语言,那么我们应该怎样进行选择呢?可能有同学会说,我原创 2020-08-01 22:57:30 · 12693 阅读 · 1 评论