Go基础
文章平均质量分 67
付少华
这个作者很懒,什么都没留下…
展开
-
Go Module的基本使用
Go Module的基本使用原创 2022-11-23 17:00:54 · 1383 阅读 · 0 评论 -
Golang正则查找与替换
package main; import ( "regexp" "fmt" "strings") func main() { //1、过正则来判断字符串是否匹配 if ok, _ := regexp.Match("^[0-9a-zA-Z_]+$", []byte("hello")); ok { fmt.Println("ok"); } //上面的例子也可以通过MatchString实现 if ok, _ := re原创 2021-09-16 16:41:47 · 4834 阅读 · 0 评论 -
Golang 的 “omitempty” 关键字略解
用法熟悉 Golang 的朋友对于 json 和 struct 之间的转换一定不陌生,为了将代码中的结构体与 json 数据解耦,通常我们会在结构体的 field 类型后加上解释说明,例如在表示一个地址的时候, json 数据如下所示{ "street": "200 Larkin St", "city": "San Francisco", "state": "CA", "zipcode": "94102"}与之相对应的 Golang 结构体表示定义如下type a原创 2021-06-19 18:10:11 · 736 阅读 · 0 评论 -
Go语言中切片操作的那些技巧
切片操作常用技巧复制最简单的、最常用的方法就是使用内置的copy函数。b = make([]T, len(a)) // 一次将内存申请到位copy(b, a)除了使用内置的copy函数外,还有下面两种使用append函数复制切片的方法。b = append([]T(nil), a...)b = append(a[:0:0], a...)这两种方法通常比使用copy函数复制的方法要慢一些,但是如果在复制之后有更多的元素要添加到b中,那么它们的效率会更高。剪切将切片a中索引i~原创 2021-06-04 08:12:31 · 888 阅读 · 1 评论 -
说说 golang 中的 string、[]rune()、[]byte()
在看本篇文章之前,建议先了解一下字符编码的知识,这里推荐两篇大神写的文章字符编码笔记:ASCII、Unicode 和 UTF-8字符串和编码string// string is the set of all strings of 8-bit bytes, conventionally but not// necessarily representing UTF-8-encoded text. A string may be empty, but// not nil. Values of stri原创 2021-04-05 23:19:11 · 319 阅读 · 1 评论 -
Golang 语言中数组和切片的区别
01 介绍在很多编程语言中都有数组,而切片类型却不常见。实际上,Golang 语言中的切片的底层存储也是基于数组。因为数组是固定长度的,而切片比数组更加灵活,所以在 Golang 语言中,数组使用的并不多,切片使用更加广泛。02 数组和切片的区别数组的零值是元素类型的零值,切片的零值是nil;数组是固定长度,切片是可变的长度数组是值类型,切片是引用类型数组:func main () { var arr1 [4]int fmt.Printf("arr1 val:%d原创 2021-04-04 23:30:37 · 2263 阅读 · 0 评论 -
Golang 语言中 map 的键值类型选择,它是并发安全的吗?
golang 原生 map 键类型选择在 golang 语言中,map 可以看作是一个 hash 表,其中 hash 的 key 的类型是受限的,而 val 的类型可以是任意类型。hash 表持有一定数量的 hash 桶, hash 桶均匀存储 hash 表的 key-val 键值对。在 hash 表中查找某个 key 的 val,我们需要传递 key 给这个 hash 表,在 golang 语言的 map 中,hash 表会先使用 hash 函数把 key 转换为 hash 值,hash 表通过原创 2021-03-21 18:46:57 · 501 阅读 · 0 评论 -
Go语言学习之并发(理论篇)
概念并发是指一个 Go 程序运行在多个 goroutine 中,每个 goroutine 中的事件执行先后顺序无法确定。并发安全并发安全是指一个可以在串行程序中正确执行的函数,它在并发调用时仍然可以正确执行,那么这个函数是并发安全的并发访问一个变量,保证变量并发安全的方法是限制变量只存于一个goroutine中,或维护一个更高层的互斥不变量。函数并发调用时,不能正常执行的原因主要有死锁、活锁和资源耗尽。竞态竞态是指一个Go程序在多个goroutine中按照某些交错顺序执行时,这原创 2021-03-21 11:26:08 · 88 阅读 · 0 评论 -
Go 语言学习之 反射(reflect)
概念在Go语言中,reflect 可以用来再运行期间获取对象的类型信息和内存结构,reflect操作所需的全部信息都源自接口变量,接口变量除了存储自身类型外,还会保存实际对象的类型数据。reflect通过TypeOf和ValueOf函数,将任何传入的对象转换为接口类型。使用反射获取对象的类型TypeOf returns the reflection Type that represents the dynamic type of i. If i is a nil interface value,原创 2021-03-21 11:06:42 · 245 阅读 · 0 评论 -
Go 面向对象编程篇:通过组合实现类的封装,继承和方法重写(多态)
要实现面向对象编程,就必须实现面向对象编程的三大特性:封装、继承和多态。封装将函数定义为归属某个自定义类型,这就等同于实现了类的成员方法,如果这个自定义类型是基于结构体的,那么结构体的字段可以看做是类的属性。package mainimport ( "fmt")type Student struct { id uint name string male bool score float64}func NewStudent(id uint, name string, .原创 2021-03-13 10:05:36 · 706 阅读 · 0 评论 -
Go 面向对象编程篇:空接口、反射和泛型
空接口的引入熟悉 Java 的同学应该都知道,在这个号称血统最纯正的面向对象编程语言中,「万事万物皆对象」,并且所有类都继承自祖宗类「Object」,所以 Object 类型变量可以指向任何类的实例。Go语言打破了传统面向对象编程中类与类之间继承的概念,而是通过组合实现方法和属性的复用,所以不存在类似的继承关系数,也就没有所谓的祖宗类,而且类与接口之间也不再通过implements 关键字强制绑定实现关系,所以 Go 语言的面向对象编程非常灵活。在Go语言中,类与接口的实现关系是通过类所实现的方法在编原创 2021-03-09 19:57:17 · 1055 阅读 · 0 评论 -
Go 面向对象编程篇:接口赋值
接口赋值概述和其他编程语言一样,Go接口不支持直接实例化,因为它只是一个契约而已,只能通过具体的类来实现声明的所有方法。不同之处在于,Go接口支持赋值操作,从而快速实现接口与实现类的映射。接口赋值在 Go 语言中分为如下两种情况:将实现接口的类实例赋值给接口;将接口赋值给另一个接口;将类实例赋值给接口先看看将类实例赋值给接口,这要求该实例对应的类实现了接口声明的所有方法,这个是自然,否则也就不能算作实现该接口了。type Integer int// 加法运算func (a Int原创 2021-03-09 13:25:07 · 1003 阅读 · 0 评论 -
Go 面向对象编程篇:接口定义及实现
接口在 Go 语言中有着至关重要的地位,如果说 goroutine 和 channel 是支撑起 Go 语言并发模型的基石,那么接口就是 Go 语言整个类型系统的基石。Go 语言的接口实现一个类型只要实现了某个接口要求的所有方法,我们就说这个类实现了该接口。例如,我们定义了一个 File 类,并实现了 Read()、Write()、Seek()、Close() 四个方法:type File struct { // ...}func (f *File) Read(buf []b.原创 2021-03-09 11:29:12 · 312 阅读 · 0 评论 -
Go 函数式编程篇:引入 Map-Reduce-Filter 模式处理集合元素
从处理集合元素聊起日常开发过程中,要处理数组、切片、字典等集合类型,常规做法都是循环迭代进行处理。比如将一个字典类型用户切片中的所有年龄属性值提取出来,然后求和,常规实现是通过循环遍历所有切片,然后从用户字典键值对中提取出年龄字段值,再依次进行累加,最后返回计算结果:package mainimport ( "fmt" "strconv")func ageSum(users []map[string]string) int { var sum int for _原创 2021-03-08 17:56:07 · 813 阅读 · 2 评论 -
Go 函数式编程篇:通过高阶函数实现装饰器模式
高阶函数所谓高阶函数,就是接收其他函数作为参数传入,或者把其他函数作为结果返回的函数。装饰器模式装饰器模式(Decorator)是一种软件设计模式,其应用场景是为某个已经存在的功能模块(类或者函数)添加一些【装饰】功能,而又不会侵入和修改原有的功能模块。就好比我们给房间做节日装饰一样,它不会调整这个房间原有的任何固有框架,而又让房间充满节日气氛。有过 Python、Java 编程经验的同学应该对这个模式很熟悉,在 Python、Java 中,我们可以通过注解非常优雅地实现装饰器模式,比如给某原创 2021-03-08 15:44:58 · 245 阅读 · 0 评论 -
指针使用入门与 unsafe.Pointer
指针简介变量的本质对一块内存空间的命名,我们可以通过引用变量名来使用这块内容空间存储的值,而指针则是用来指向这些变量值所内存地址的值注:变量值所在的内存地址的值不等于内存地址存储的变量值注:如果一个变量是指针类型的,那么就可以用这个变量来存储指针类型的值栗子:package mainimport "fmt"func main() { a := 100 var ptr *int // 声明指针类型 ptr = &a // 初始化指针类型值为变量 a fmt.P原创 2021-03-05 00:06:20 · 3090 阅读 · 2 评论 -
Golang标准库-io
io包概述:在io包中最重要的是两个接口:Reader和Writer接口。其它的各种io包,都跟这两个接口有关,也就是说,只要实现了这两个接口,它就有io的功能目前,Go文档中还没法直接列出实现了某个接口的所有类型。不过,我们可以通过查看标准库文档,列出实现了> io.Reader或io.Writer接口的类型(非io包):os.File 同时实现了 io.Reader 和 io.Writerstrings.Reader 实现了 io.Readerbufio.Reader/Writer原创 2021-02-28 16:41:44 · 564 阅读 · 1 评论 -
Golang标准库 math 常用的一些方法及数值操作
package mainimport ( "fmt" "math")func main() { i := -2 fmt.Println(math.Abs(float64(i))) //取到绝对值 fmt.Println(math.Ceil(3.8)) //向上取整 fmt.Println(math.Floor(3.6)) //向下取整 fmt.Println("取余",math.Mod(11,3)) //取余数 11%3 效果一样 fmt.Println(math原创 2021-02-18 17:37:45 · 1187 阅读 · 0 评论 -
Golang 定时器使用方法汇总
平时开发过程中,我们经常会遇到在将来某个时间点或者间隔一段时间重复执行函数。这个时候我们就可以考虑使用定时器,这篇文章将会与大家一起,总结下 Go 语言里 time.Timer、time.Ticker、time.After 和 time.AfterFunc 的相关用法及需要注意的地方。Timer 定时器00Go 语言除了可以使用 time.Sleep() 实现延时之外,Timer 也可以实现,就像下面这样:func main() { // fmt.Println("公众号:Golang来.原创 2021-02-17 18:03:34 · 1150 阅读 · 0 评论 -
golang sleep(睡眠)
golang的休眠可以使用time包中的sleep。函数原型为:func Sleep(d Duration)其中的Duration定义为:type Duration int64Duration的单位为 nanosecond。为了便于使用,time中定义了时间常量:const ( minDuration Duration = -1 << 63 maxDuration Duration = 1<<63 - 1)Example下面实现休眠2秒功能。pac原创 2021-02-17 17:46:13 · 18529 阅读 · 0 评论 -
函数是一等公民,这到底在说什么?
请问下各位大佬,这是什么语法,为什么不需要参数的?对于有些人来说这根本不是问题,但有些人却想不明白。我提到,在 Go 语言中,函数是一等公民,但对方不清楚这到底在说什么。看来有必要解释下什么是一等公民。再往下看之前,你能说出什么是一等公民吗?关于一等公民[1](First-class citizen)看看维基百科的定义:In programming language design, a first-class citizen (also type, object, entity, or va..原创 2021-02-16 18:38:30 · 2390 阅读 · 0 评论 -
将json反序列化为结构体,并将其赋值到新的结构体中,最后对其新的结构体切片进行排序
栗子:package mainimport ( "encoding/json" "fmt" "sort" //"sort")type Shards struct { Failed int `json:"failed"` Skipped int `json:"skipped"` Successful int `json:"successful"` Total int `json:"total"`}type Aggregations struct {原创 2021-02-07 00:29:02 · 375 阅读 · 0 评论 -
Go语言:发送HTTP请求(GET & POST&NewRequest)
代码示例:package mainimport ( "bytes" "encoding/json" "io" "io/ioutil" "net/http" "time")// 发送GET请求// url: 请求地址// response: 请求返回的内容func Get(url string) string { // 超时时间:5秒 client := &http.Client{Timeout:原创 2021-02-01 11:42:02 · 13232 阅读 · 0 评论 -
goalng 通过指针对值进行修改(结构体类型)&向切片类型的结构体追加值
值类型进行修改值类型对值修改无效package mainimport ( "fmt")type message struct { name string age int sex string}func main() { ret :=[]message{ { "小李", 18, "男"}, { "小李2", 18, "男"}, { "小李2", 18, "男"}, } for _,ret1 :=range ret{ ret1.name="小刚" }原创 2021-01-20 15:30:46 · 182 阅读 · 0 评论 -
Golang标准库-strconv 字符串转换
package mainimport ( "fmt" "strconv")func main() { /*****Format系列(其它类型转字符串)*****/ //bool转字符串 fmt.Println(strconv.FormatBool(true)) //'f'指打印格式以小数方式,3:指小数位数,64:指float64处理 fmt.Println(strconv.FormatFloat(2.12,'f',3,64)) //原创 2021-01-17 20:48:58 · 217 阅读 · 0 评论 -
Golang标准库-strings 字符串操作
字符串处理字符串在开发中经常用到,包括用户输入,数据库读取数据,我们经常需要对字符串进行分割,连接,转换的等操作字符串操作前缀和后缀HasPrefix判断字符串是否以prefix开头函数签名strings.HasPrefix(s,prefix string)boolHasSuffix判断字符串s是否以suffix结尾:函数签名strings.HasSuffix(s,suffix string)bool栗子:package mainimport ( "fmt" "s原创 2021-01-15 23:44:23 · 374 阅读 · 0 评论 -
Golang标准库-Time 时间操作大全
平时开发过程中,时间相关的操作用的还是很多的。接下来就与大家一起总结下与时间有关的操作,主要涉及到 time 包,核心数据结构是 time.Time,如下:type Time struct { wall uint64 ext int64 loc *Location}1.获取时间相关函数获取当前时间// 返回当前时间,注意此时返回的是 time.Time 类型now := time.Now()fmt.Println(now)// 当前时间戳fmt.Println(原创 2021-01-14 00:07:58 · 2190 阅读 · 0 评论 -
Go中三种排序:排序整数、浮点数和字符串切片,使用自定义比较器排序,排序任意数据结构
排序整数、浮点数和字符串切片对于[]int ,[]float.[]string这种元素类型时基础类型的切片使用sort包提供了下面几个函数进行排序:sort.Intssort.Floatssort.Stringss := []int{4, 2, 3, 1}sort.Ints(s)fmt.Println(s) // 输出[1 2 3 4]使用自定义比较器排序使用sort.Slice函数排序,它使用一个用户提供的函数来对序列进行排序,函数类型为func(i, j int) bool,其原创 2020-12-21 10:58:53 · 725 阅读 · 0 评论 -
Golang 切片类型的接口存储多层嵌套Map对象,如何初始化,又如何直接读取嵌套层的key-value值
package mainimport ( "fmt" "reflect")func main() { //定义一个接口类型的切片 in := make([]interface{}, 3) m1 := make(map[string]string) m2 := make(map[string][]byte) //初始化键值对 m1 = map[string]string{ "teleplay1": "情定大饭店", "teleplay2": "天国的阶梯", "tel原创 2020-12-19 18:55:05 · 862 阅读 · 1 评论 -
Go Map初始化方式及Map的多层嵌套
package mainimport ( "fmt")func main() { //多维map的声明与实现 //方法1:初始化一个空的多维映射 mainMapA :=map[string]map[string]string{} subMapA :=map[string]string{"A_Key_1":"A_SubValue_1","A_key_2":"A_SubValue_2"} mainMapA["MapA"] =subMapA fmt.Println("\nMultit原创 2020-12-19 17:21:23 · 3417 阅读 · 1 评论 -
Go 切片类型的结构体进行json序列化与反序列化
思路:一个json对象就是一个结构体一个json数组就是一个切片json数组放json对象就是切片里面放结构体{ "order_id":"2019070721318", "order_price":26.87, "goods":[ { "goods_name":"手机", "goods_price":23.9, "goods_coloer":[原创 2020-12-19 14:37:18 · 671 阅读 · 1 评论 -
Go 切片类型的Map进行json序列化与反序列化
思路:一个json对象就是一个map一个json数组就是一个切片json数组放对象就是相当于切片里面放map{ "good":[ { "good_name":"手机", "good_price":23.1, "goods_color":[ { "good_color":"粉红色", "g原创 2020-12-19 12:13:29 · 1762 阅读 · 1 评论 -
go语言中字段序列化与反序列化的总结
一、概括JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,现在是主流的数据格式常用于web开发中前端与后端进行数据交换的一中方式二、在go中常见的几种序列化成json的方式1、将结构体序列化成jsonpackage mainimport ( "encoding/json" "fmt")type Student struct { Name string `json:"name"` // 姓名 Age原创 2020-12-18 11:45:26 · 474 阅读 · 0 评论 -
详解Go中匿名函数,闭包函数,回调函数
匿名函数匿名函数没有函数名,只有函数体,函数可以被作为一种类型被赋值给变量,匿名函数也往往以变量的方式被传递。匿名函数经常被用于实现回调函数、闭包等。定义格式如下:func(参数列表)(返回参数列表){ //函数体}方式一:在定义时调用匿名函数func anonymousFunc1() { func(data int) { fmt.Println("hello", data) }(100)}这里的100是匿名函数的参数方式二:将匿名函数赋值给变量原创 2020-12-17 15:46:28 · 399 阅读 · 0 评论 -
golang语言中struct的初始化方式
方法一:通过var声明结构体var t T系统会自动初始化它的默认值,比如int初始化为0.指针初始化为nil,同样也会为结构体类型数据分配内存,此时类型为T方法二:通过new或&进行声明(new和&初始化方式相同)t := new(T)// 先定义结构体type Rect struct { width int height int}// 再初始化结构体rect1 := new(Rect)rect2 := &Rect{}rect3 := &a原创 2020-12-16 16:17:37 · 4825 阅读 · 0 评论 -
遍历值为结构体类型的Map并append到切片类型的结构体中
package mainimport "fmt"type NotknownType struct { S1 string S2 string S3 string}func main() { a1 :=NotknownType{S3: "nnn",S2: "bbb",S1: "ccc"} a2 :=NotknownType{S3: "nnn",S2: "bbb",S1: "ccc"} a3 :=NotknownType{S3: "nnn",S2: "bbb",S1: "ccc.原创 2020-12-06 01:56:34 · 449 阅读 · 0 评论 -
goroutine并发控制与通信
开发go程序的时候,时常需要使用goroutine并发处理任务,有时候这些goroutine是相互独立的,而有的时候,多个goroutine之间常常是需要同步与通信的。另一种情况,主goroutine需要控制它所属的子goroutine,总结起来,实现多个goroutine间的同步与通信大致有:全局共享变量channel通信(CSP模型)Context包本文章通过goroutine同步与通信的一个典型场景-通知子goroutine退出运行,来深入讲解下golang的控制并发。通知多个子.转载 2020-06-10 00:24:02 · 214 阅读 · 0 评论 -
go包管理发展历史
下面是官方的包管理工具的发展历史:在 1.5 版本之前,所有的依赖包都是存放在 GOPATH 下,没有版本控制。这个类似 Google 使用单一仓库来管理代码的方式。这种方式的最大的弊端就是无法实现包的多版本控制,比如项目 A 和项目 B 依赖于不同版本的 package,如果 package 没有做到完全的向前兼容,往往会导致一些问题。1.5 版本推出了 vendor 机制。所谓 vendor 机制,就是每个项目的根目录下可以有一个 vendor 目录,里面存放了该项目的依赖的 package。g原创 2020-11-12 20:01:37 · 396 阅读 · 0 评论 -
深入解读go语言之反射reflect
反射的概念反射机制就是运行时动态的调用对象的方法和属性。interface和反射在讲反射之前,先来看看Golang关于类型设计的一些原则变量包括(type,value)两部分理解这一点就知道为什么nil !=nil了type 包括static type 和 concrete(具体的,确定的) type。简单来说 static type 是你在编码时看见的类型如(int string) ,concrete type 是runtime系统看见的类型类型断言能否成功,取决于变量的co原创 2020-11-11 19:30:04 · 365 阅读 · 0 评论 -
深入解读go语言之 排序:sort
首先看一下sort包的原理func Sort(data Interface) { // Switch to heapsort if depth of 2*ceil(lg(n+1)) is reached. n := data.Len() maxDepth := 0 for i := n; i > 0; i >>= 1 { maxDepth++ } maxDepth *= 2 quickSort(data, 0, .原创 2020-11-07 18:05:35 · 432 阅读 · 0 评论