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 429 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 400 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 367 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 380 0
Go语言的接口详解

Go语言的接口详解

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

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

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

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

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

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

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

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

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

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

2022-11-25 368 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 382 0
Go官方工具链用法详解

Go官方工具链用法详解

Go官方工具链 为了从任意目录运行Go官方工具链中工具命令(通过go命令), Go官方工具链安装目录下的bin子目录路径必须配置在PATH环境变量中。 当使用安装程序安装Go官方工具链时,安装程序很可能已经自动地将此配置好了。windows环境中需要在把安装目录下bin子目录添加到高级系统环境变量中保存生效。 Go官方工具链近来的版本都支持一个称为Go模块(Go modules)的特性, 用来管理项目依赖。此特性在版本1.11中被试验性引入, 在版本1.16中被默认支持。 第一个环境变量 我们应该了解一个环境...

2022-11-25 399 0
Go语言--切片(Slice)详解

Go语言--切片(Slice)详解

说明: Go 语言切片是对数组的抽象。 Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。 一、定义切片 注意:切片不需要说明长度 1、声明一个未指定大小的数组来定义切片 var identifier []type //例如 var slice []int 2、使用make()函数来创建切片 var slice1 []type =...

2022-11-25 407 0
golang交叉编译详细

golang交叉编译详细

1、环境变量对照表 golang交叉编译环境变量对照表 GOOS | GOARCH | OS VERSION ---|---|--- linux | 386 / amd64 / arm | >= Linux 2.6 darwin | 386 / amd64 | OX X (Snow Leopard + Lion) freebsd | 386 / amd64 | >= FreeBSD 7 windows | 386 / amd64 | >= Windows 2000...

2022-11-25 392 0
Go 泛型和非泛型代码详解

Go 泛型和非泛型代码详解

1. 开启泛型 在 Go1.17 版本中,可以通过: export GOFLAGS="-gcflags=-G=3" 或者在编译运行程序时加上: go run -gcflags=-G=3 main.go 2.无泛型代码和泛型代码 2.1. AddSlice 首先看现在没有泛型的代码:  package main ​ import ( "fmt" ) ​ func AddIntSlice(input []int, diff int)...

2022-11-25 386 0
Go语言基础语法之结构体及方法详解

Go语言基础语法之结构体及方法详解

结构体类型可以用来保存不同类型的数据,也可以通过方法的形式来声明它的行为。本文将介绍go语言中的结构体和方法,以及“继承”的实现方法。 结构体类型 结构体类型(struct)在go语言中具有重要地位,它是实现go语言面向对象编程的重要工具。go语言中没有类的概念,可以使用结构体实现类似的功能,传统的OOP(Object-Oriented Programming)思想中的继承在go中可以通过嵌入字段的方式实现。 结构体的声明与定义: // 使用关键字 type 和 struct 定义名字为Person结构...

2022-11-25 390 0
Go并发编程实现数据竞争

Go并发编程实现数据竞争

1.前言 虽然在 go 中,并发编程十分简单, 只需要使用 go func() 就能启动一个 goroutine 去做一些事情,但是正是由于这种简单我们要十分当心,不然很容易出现一些莫名其妙的 bug 或者是你的服务由于不知名的原因就重启了。 而最常见的bug是关于线程安全方面的问题,比如对同一个map进行写操作。 2.数据竞争 线程安全是否有什么办法检测到呢? 答案就是 data race tag,go 官方早在 1.1 版本就引入了数据竞争的检测工具,我们只需要在执行测试或者是编译的时候加上 -ra...

2022-11-25 392 0