Go语言并发编程 sync.Once

Go语言并发编程 sync.Once

sync.Once用于保证某个动作只被执行一次,可用于单例模式中,比如初始化配置。我们知道init()函数也只会执行一次,不过它是在main()函数之前执行,如果想要在代码执行过程中只运行某个动作一次,可以使用sync.Once,下面来介绍一下它的使用方法。 先来看下面的代码: package main import ( "fmt" "sync" ) func main() { var num = 6 var once sync.Once add_one := fu...

2022-11-25 233 0
Go 并发读写 sync.map 详细

Go 并发读写 sync.map 详细

map 的两种目前在业界使用的最多的并发支持的模式分别是: 原生 map + 互斥锁或读写锁 mutex。 标准库 sync.Map(Go1.9及以后)。 有了选择,总是有选择困难症的,这两种到底怎么选,谁的性能更加的好?我有一个朋友说 标准库 sync.Map 性能菜的很,不要用。我到底听谁的... 今天煎鱼就带你揭秘 Go sync.map,我们先会了解清楚什么场景下,Go map 的多种类型怎么用,谁的性能最好! 接着根据各 map 性能分析的结果,针对性的对 sync.map 进行源码...

2022-11-25 233 0
关于Go 是传值还是传引用?

关于Go 是传值还是传引用?

关于Go 是传值还是传引用?很多人都讨论起来 下面我们就带着问题一起探索答案吧 1、Go 官方的定义 本部分引用 Go 官方 FAQ 的 “When are function parameters passed by value?”,内容如下。 如同 C 系列的所有语言一样,Go 语言中的所有东西都是以值传递的。也就是说,一个函数总是得到一个被传递的东西的副本,就像有一个赋值语句将值赋给参数一样。 例如: 向一个函数传递一个 int 值,就会得到 int 的副本。而传递一个指针...

2022-11-25 207 0
关于Go 空结构体的 3 种使用场景

关于Go 空结构体的 3 种使用场景

前言: 在 Go 语言中,有一个比较特殊的类型,经常会有刚接触 Go 的小伙伴问到,又或是不理解。 他就是 Go 里的空结构体(struct)的使用,常常会有看到有人使用: ch := make(chan struct{}) 还清一色的使用结构体,也不用其他类型。高度常见,也就不是一个偶发现象了,肯定是背后必然有什么原因。 1、为什么使用 说白了,就是希望节省空间。但,新问题又来了,为什么不能用其他的类型来做? 这就涉及到在 Go 语言中 ”宽度“ 的概念,宽度描述了一个类型的实例所...

2022-11-25 249 0
Golang 利用反射对结构体优雅排序的操作方法

Golang 利用反射对结构体优雅排序的操作方法

最近开始实习,工作技术栈主要Python和Golang,目前的任务把Python模块重构为GO模块,然后出现了一个问题,就是要将一个结构体按结构体中各个字段进行排序,然后写入Redis,对于Pyhon来说for循环就能解决,但是对于Go语言来说,每一次排序都要写一个比较函数,写出来的代码太丑,非常长,代码结构是一致,只是比较字段不一样而已,个人无法接受啊,网上搜索也没搜索到合适解决方法,所以自己想了一个解决方法来优雅排序。 比较函数: func reflectCmp(i, j interface{}, fi...

2022-11-25 241 0
Go语言之fo循环与条件判断

Go语言之fo循环与条件判断

一、for循环 Go 语言中没有 while 循环,只有一个 for 循环 for 变量初始化;条件;变量自增/自减 { 循环体内容 } 1、基本使用 for i := 0; i < 10; i++ { fmt.Println(i) } 2、省略第一部分 i := 0 for ; i < 10; i++ { fmt.Println(i) } 3、省略第一和三部分(这是一个 while 循环) for 条件 { 循环体内容...

2022-11-25 206 0
Go语言之Goroutine与信道异常处理

Go语言之Goroutine与信道异常处理

一、Goroutine Go 协程可以看做成一个轻量级的线程,Go 协程相比于线程的优势: Goroutine 的成本更低大小只有 2 kb 左右,线程有几个兆。 Goroutine 会复用线程,比如说:我有 100 个协程,但是都是共用的的 3 个线程。 Goroutine 之间通信是通过 channel 通信的。(Go 推崇的是信道通信,而不推崇用共享变量通信) 1、启动一个 Goroutine func test() { fmt.Println("go go go") } fu...

2022-11-25 226 0
详细介绍Go语言之数组与切片

详细介绍Go语言之数组与切片

一、数组 数组是同一类型元素的集合,可以放多个值,但是类型一致,内存中连续存储 Go 语言中不允许混合不同类型的元素,而且数组的大小,在定义阶段就确定了,不能更改 1、数组的定义 // 定义一个大小为3的string类型和int8类型的数组,里面可以放3个字符串和3个数字 var names [3]string var ages [3]int8 fmt.Println(names, ages) // 输出:[ ] [0 0 0] 2、数组赋值 var ages [3]int8...

2022-11-25 206 0
Go语言之结构体与方法

Go语言之结构体与方法

一、结构体 结构体是一系列属性的集合(类似于 Python 中的类) 1、结构体的定义与使用 // 定义 type Person struct { Name string Age int Sex string } func main() { // 使用 var per Person per.Name="XiaoYang" fmt.Println(per) } 2、定义并赋初值 type Person struct {...

2022-11-25 193 0
golang中接口对象的转型两种方式

golang中接口对象的转型两种方式

接口对象的转型有两种方式: 1. 方式一:instance,ok:=接口对象.(实际类型)   如果该接口对象是对应的实际类型,那么instance就是转型之后对象,ok的值为true   配合if...else if...使用 2. 方式二:   接口对象.(type)   配合switch...case语句使用 示例: package main import ( "fmt" "math" ) type shape interface { perim...

2022-11-25 208 0
Go语言的接口详解

Go语言的接口详解

接口就是一系列方法的集合(规范行为) 在面向对象的领域里,接口一般这样定义:接口定义一个对象的行为,规范子类对象的行为。 在 Go 语言中的接口是非侵入式接口(接口没了,不影响代码),侵入式接口(接口没了,子类报错) Go 也是鸭子类型,比如我现在有个鸭子类,内有 speak 方法和 run 方法,子类只要实现了 speak 和 run,我就认为子类是鸭子,我只要子类中有这两个方法你就是鸭子,有这两个方法你就是鸭子,他是从下往上推导只要有你这里面的东西,那就是算是继承了你这个接口 1、接口的用途 接口是一...

2022-11-25 221 0
一文理解Go 中的可寻址和不可寻址

一文理解Go 中的可寻址和不可寻址

1. 什么叫可寻址? 可直接使用 & 操作符取地址的对象,就是可寻址的(Addressable)。比如下面这个例子 func main() { name := "iswbm" fmt.Println(&name) // output: 0xc000010200 } 程序运行不会报错,说明 name 这个变量是可寻址的。 但不能说 "iswbm" 这个字符串是可寻址的。 "iswbm" 是字符串,字符串都是不可变的,是不可寻址的,后面会...

2022-11-25 228 0
Go语言区别于其他语言的特性

Go语言区别于其他语言的特性

前言: 随着编程语言的发展,Go 还很年轻。它于 2009 年 11 月 10 日首次发布。其创建者Robert Griesemer Rob Pike 和 Ken Thompson在 Google 工作,在那里大规模扩展的挑战激励他们将 Go 设计为一种快速有效的编程解决方案,用于具有大型代码库、管理由多个开发人员,具有严格的性能要求,并跨越多个网络和处理核心。 Go 的创始人在创建他们的新语言时也借此机会学习了其他编程语言的优点、缺点和漏洞。结果是一种干净、清晰和实用的语言,具有相对较少的命令和功能集。 1....

2022-11-25 224 0
Go语言并发编程之互斥锁Mutex和读写锁RWMutex

Go语言并发编程之互斥锁Mutex和读写锁RWMutex

在并发编程中,多个Goroutine访问同一块内存资源时可能会出现竞态条件,我们需要在临界区中使用适当的同步操作来以避免竞态条件。Go 语言中提供了很多同步工具,本文将介绍互斥锁Mutex和读写锁RWMutex的使用方法。 一、互斥锁Mutex 1、Mutex介绍 Go 语言的同步工具主要由 sync 包提供,互斥锁 (Mutex) 与读写锁 (RWMutex) 就是sync 包中的方法。 互斥锁可以用来保护一个临界区,保证同一时刻只有一个 goroutine 处于该临界区内。主要包括锁定(Lock方法)和...

2022-11-25 187 0
Go select 死锁的一个细节

Go select 死锁的一个细节

下面对是一个 select 死锁的问题 package main import "sync" func main() { var wg sync.WaitGroup foo := make(chan int) bar := make(chan int) wg.Add(1) go func() { defer wg.Done() select { case foo <- <-bar: default: println("default"...

2022-11-25 202 0