`
文章列表
package main /* golang并发安全和锁 互斥锁:并发编程中对共享资源进行访问的控制手段,由标准库中的Mutex结构体类型, sync.Mutex类型只有两个公开的指针方法,Lock和Unlock 可以通过go build -race main.go 编译后运行, 查看共享资源的竞争 互斥锁本质是当一个goroutine访问的时候,其他的goroutin都不能访问, 程序由原来的并行执行变成了串行执行 读写锁:读写锁可以让多个读操作并发,同时读取,但是对于写操作是完全互斥的。 ...
package main import "fmt" import "time" /* goroutine中的异常通过defer+recover捕获 */ func fn1(){ for i:=0;i<5;i++{ time.Sleep(time.Millisecond*10) fmt.Println("hello") } } func test(){ //捕获异常,匿名自执行函数 defer func(){ err:= recover() if ...
package main import "fmt" import "time" //单向管道 func main() { //默认情况下管道是双向的,可读可写 ch:= make(chan int, 3) // 给管道里存数据 ch<-10 ch<-20 ch<-30 //从管道里取值 <-ch //单向管道,只写 ch2 := make(chan<- int, 3) ch2<-10 //单向管道,只读 ch3 := mak ...
package main import "fmt" /* 管道Channel是goroutine间的通讯方式,可以使用channel在多个goroutine之间传递消息 golang的并发模型是CSP,提倡通过通信共享内存,而不是通过共享内存实现通信 1.管道的类型,是引用数据类型 2.如果创建管道的时候没有指定容量,那么这个管道就是无缓冲的管道,由称为阻塞管道 3.如果管道满了,你还往管道存储数据,会报deadlock错 4.在没有使用协程的情况下,如果我们的管道数据已经全部取出,再取就会报deadlock错, */ func ...
package main import "fmt" import "time" import "sync" import "runtime" /* golang中一个goroutine(协程)默认占用的内存远比java、C的线程少,操作系统线程一般都有固定的栈内存,通常为2M 一个goroutine占用的内存非常小,一般为2k,多协程切换调度开销远比多线程小 */ /* 以下代码的问题:如果主线程执行结束,不管协程是否执行完成都退出 通过sync.WaitGroup可 ...

go语言中的闭包

    博客分类:
  • Go
package main import "fmt" // golang闭包 /* 全局变量的特点: 1.常驻内存 2. 污染全局 局部变量的特点: 1.不常驻内存 2.不污染全局 闭包: 1.可以让一个变量常驻内存 2.可以让一个变量不污染全局 */ /* 闭包 1.闭包是指有权访问另一个函数作用域中的变量的函数 2.创建闭包的常见方式就是在一个函数内部创建另一个函数, 内函数可以访问外函数的变量 注意: 闭包里作用域返回的 ...
package main import "fmt" /* 一个结构体实现多个接口 */ type AInterface interface { setName(string) getName()string } type BInterface interface { run(string) } //接口的嵌套 type Animaler interface { AInterface BInterface } type Dog struct { name string } //结构体是 ...
package main import "fmt" /* 结构体值类型接收者和指针类型接收者实现结构体的区别 结构体的方法是值接收者,实例化后的结构体值类型和指针类型都可以赋值给接口变量 结构体的方法是指针接收者,实例化后的结构体指针类型才可以赋值给接口变量,值类型不能赋值给接口变量 */ type Animaler interface { setName(string) getName()string } type Dog struct { name string } func(d *Dog) s ...

golang的字典map

    博客分类:
  • Go
package main import "fmt" func main() { //make创建map类型 var userinfo = make(map[string]string) userinfo["name"] = "username" userinfo["age"]="age" userinfo["sex"]="男" fmt.Println(userinfo) //map[name:userna ...

golang的数组和切片

    博客分类:
  • Go
//定义变量的两种方式: //1.var 变量名 变量类型 = 变量值 var a int = 3 var a=3 //类型推导的方式 //短变量声明法,只能声明局部变量, 不能声明全局变量: //2.变量名 := 变量值 _ a := 3 //变量声明后没有赋值,默认为空 // ...

golang的切片

    博客分类:
  • Go
package main import ( "fmt" ) func main() { //make函数创建切片 make([]T, size, cap) slice := make([]int, 4, 8) fmt.Println(slice) fmt.Printf("%d----%d\n", len(slice),cap(slice)) //切片的修改 slice[1]=10 slice[2]=30 fmt.Println(slice) //golang中只能通过appe ...

golang的函数

    博客分类:
  • Go
package main import "fmt" //函数存在的意义:函数是一段代码的封装,把一段逻辑抽象出来封装到函数中, 起个名字,通过函数名调用, 代码结构清晰,简洁 //函数定义 func sum(x int, y int)(ret int){ return x + y } //有参数没有返回值 func f1(x int, y int){ fmt.Println("f1") } //没有参数没有返回值 func f2(){ fmt.Println("f2") } ...
package main import "fmt" /* 1. 在golang中接口是一种抽象类型,接口是一组函数的集合,golang中的接口不能包含任何变量 2. golang接口中所有的方法都没有方法体,只定义规范不实现。接口体现了程序设计的多态和高内 ...

go mod

    博客分类:
  • Go
1.golang中包的介绍和定义 golang中的包分为三种: 1)系统内置的包, 2)自定义包, 3)第三方的包,第三方包也属于自定义包的一种,需要下载安装到本地后磁能使用 2.go mod init 项目名称 初始化项目 3.package 包名必须写首行 4.如果main包中有init方法,init方法优先于main方法执行,跟位置无关,系统自动执行init方法 5.go的第三方包可以去https://pkg.go.dev/这里去查找 6.go get 包名称 (全局) go mod download (全局) go mod vendor 将以来复制到当前 ...

golang的结构体

    博客分类:
  • Go
package main import "fmt" //golang中结构体实例是独立的,彼此不会相互影响 //自定义类型 type myInt int //给自定义类型添加方法 func (a myInt) print(){ fmt.Println("自定义类型的方法") } //结构体 type User struct { name string age int } //结构体方法 func (p User) printUser(){ fmt.Printf("name=%v, ...
Global site tag (gtag.js) - Google Analytics