- 浏览: 224855 次
最新评论
-
redcoatjk:
redcoatjk 写道例子有问题.my fault.返回用I ...
hibernate抓取策略,batch-size的用法 -
redcoatjk:
例子有问题.
hibernate抓取策略,batch-size的用法
文章列表
go语言goroutine并发安全和锁(五)
- 博客分类:
- Go
package main
/*
golang并发安全和锁
互斥锁:并发编程中对共享资源进行访问的控制手段,由标准库中的Mutex结构体类型,
sync.Mutex类型只有两个公开的指针方法,Lock和Unlock
可以通过go build -race main.go 编译后运行, 查看共享资源的竞争
互斥锁本质是当一个goroutine访问的时候,其他的goroutin都不能访问,
程序由原来的并行执行变成了串行执行
读写锁:读写锁可以让多个读操作并发,同时读取,但是对于写操作是完全互斥的。
...
go语言goroutine的异常捕获(四)
- 博客分类:
- Go
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 ...
go语言goroutine的管道channel(三)
- 博客分类:
- Go
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 ...
go语言goroutine的通信机制(二)
- 博客分类:
- Go
package main
import "fmt"
/*
管道Channel是goroutine间的通讯方式,可以使用channel在多个goroutine之间传递消息
golang的并发模型是CSP,提倡通过通信共享内存,而不是通过共享内存实现通信
1.管道的类型,是引用数据类型
2.如果创建管道的时候没有指定容量,那么这个管道就是无缓冲的管道,由称为阻塞管道
3.如果管道满了,你还往管道存储数据,会报deadlock错
4.在没有使用协程的情况下,如果我们的管道数据已经全部取出,再取就会报deadlock错,
*/
func ...
go语言的协程goroutine(一)
- 博客分类:
- Go
package main
import "fmt"
import "time"
import "sync"
import "runtime"
/*
golang中一个goroutine(协程)默认占用的内存远比java、C的线程少,操作系统线程一般都有固定的栈内存,通常为2M
一个goroutine占用的内存非常小,一般为2k,多协程切换调度开销远比多线程小
*/
/*
以下代码的问题:如果主线程执行结束,不管协程是否执行完成都退出
通过sync.WaitGroup可 ...
package main
import "fmt"
// golang闭包
/*
全局变量的特点:
1.常驻内存
2. 污染全局
局部变量的特点:
1.不常驻内存
2.不污染全局
闭包:
1.可以让一个变量常驻内存
2.可以让一个变量不污染全局
*/
/*
闭包
1.闭包是指有权访问另一个函数作用域中的变量的函数
2.创建闭包的常见方式就是在一个函数内部创建另一个函数, 内函数可以访问外函数的变量
注意:
闭包里作用域返回的 ...
go语言接口interface(三)
- 博客分类:
- Go
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
}
//结构体是 ...
go语言接口interface(二)
- 博客分类:
- Go
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
//变量声明后没有赋值,默认为空
// ...
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 ...
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")
}
...
go语言接口interface(一)
- 博客分类:
- Go
package main
import "fmt"
/*
1. 在golang中接口是一种抽象类型,接口是一组函数的集合,golang中的接口不能包含任何变量
2. golang接口中所有的方法都没有方法体,只定义规范不实现。接口体现了程序设计的多态和高内 ...
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, ...