go chan有缓冲无缓冲区别
同步非同步区别
有缓冲与无缓冲123c1:=make(chan int) //无缓冲c2:=make(chan int,1) //有缓冲c1 <- 1
无缓冲c1 通道放入1后需要有携程一直处理,不然一直会阻塞下去
方向论证代码(错误示例)1234567package mainfunc main() { c1 := make(chan int) c1 <- 1 //没有处理接收就堵塞这里了 //fatal error: all goroutines are asleep - deadlock! <-c1}
正确示例12345678910111213141516171819202122232425package mainimport ( "fmt" "time")func read(out chan int) { for { fmt.Println("waiting => ", time.Now()) ...
Go 提供了一个 flag 包,支持基本的命令行标志解析。我们将用这个包来实现我们的命令行程序示例。
1、设置提示接收参数
123456789//基本的标记声明仅支持字符串、整数和布尔值选项。这里我们声明一个默认值为 "foo" 的字符串标志 word并带有一个简短的描述。这里的 flag.String 函数返回一个字符串指针(不是一个字符串值),在下面我们会看到是如何使用这个指针的。wordPtr := flag.String("word", "foo", "a string")//使用和声明 word 标志相同的方法来声明 numb 和 fork 标志。numbPtr := flag.Int("numb", 42, "an int")boolPtr := flag.Bool("fork", false, "a bool")//用程序中已有的参数来声明一个标志也是可以的。注意在标志声明函数中需要使用该参数的指针。var s ...
1.使用方式
数组和slice长的很像,操作方式也都差不多,并且slice包含了数组的基本的操作方式,如下标、range循环,还有一些如len()则是多种类型共用,所以根据操作根本搞不清数组和切片的区别,能够看出区别的地方主要看如何声明的。
数组的声明方式很单一,通常就是下面这样:
123array1 := [5]int{1, 2, 3, 4, 5}array2 := [5]int{}
slice的声明方式就非常多样了,如前面介绍的几种:
1234567var slice1 = []int{1, 2, 3, 4, 5}var slice2 = make([]int, 0, 5)var slice3 = make([]int, 5, 5)var slice4 = make([]int, 5)
加上对数组的切片和append操作都会产生数组切片(slice)
2.值传递or引用传递
12345678910111213141516171819202122232425262728293031func arrayModify ...
mysql
未读mysql的工作原理一张经典的图:
上面的图就是mysql的内部架构,可以清楚的看到Mysql是由SQL接口,解析器,优化器,缓存,存储引擎组成的。
下面是关于上述部件的介绍:
1. connectors
与其他编程语言中的sql 语句进行交互,如php、java等。
2. Management Serveices & Utilities
系统管理和控制工具
3. Connection Pool (连接池)
管理缓冲用户连接,线程处理等需要缓存的需求
4. SQL Interface (SQL接口)
接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface
5. Parser (解析器)
SQL命令传递到解析器的时候会被解析器验证和解析。
主要功能:
a . 将SQL语句分解成数据结构,并将这个结构传递到后续步骤,后面SQL语句的传递和处理就是基于这个结构的
b. 如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的,语句将不会继续执行下去
6. Optimizer (查询优化器)
SQ ...
数据流
数据流(data stream)最初是通信领域使用的概念,代表传输中所使用的信息的数字编码信号序列。然而,我们所提到的数据流概念与此不同。这个概念最初在1998年由Henzinger在文献87中提出,他将数据流定义为“只能以事先规定好的顺序被读取一次的数据的一个序列”。百度百科参考地址
输入流与输出流
数据流分为输入流(InputStream)和输出流(OutputStream)两类。输入流只能读不能写,而输出流只能写不能读。
输入流可从键盘或文件中获得数据,输出流可向显示器、打印机或文件中传输数据。
PHP Streams是内置核心操作
PHP Streams 用于统一文件、网络、数据压缩类文件操作方式,并未这些类文件操作提供一组通用的函数接口。
一个stream就是一个具有流式行为的资源对象,每个stream对象都有一个包装类。Stream 可以通过://方式来引用。其中是包装类的名字,中的内容是由包装类的语法指定,不同的包装类的语法会有所不同。
内置默认的包装类
12345678910111213141516171819202122232425 ...
ssh异常处理 Permission denied (publickey,keyboard-interactive).
异常解决办法 设置sshd的配置文件(sshd_config)的这条配置:PasswordAuthentication yes 然后重启服务:service sshd restart
sshd 错误找不到 -bash: service: command not found1234$ whereis sshdsshd: /usr/sbin/sshd //获取路径# 重启/usr/sbin/sshd restart
title : go mysql 链接池category : gotag : go mysql
mysql自带链接池,使用步骤
首先开启web服务
1234http.HandleFunc("/index", pool)if err := http.ListenAndServe(":9090", nil); err != nil { panic(err)}
db初始化全局对象
12345678var db *sql.DBfunc init() { //初始化数据库链接 建立连接池 db, _ = sql.Open("mysql", "root:@tcp(127.0.0.1:3306)/qipajun?charset=utf8") db.SetMaxOpenConns(2000) //用于设置最大打开的连接数,默认值为0表示不限制。 db.SetMaxIdleConns(1000) //SetMaxIdleConns用于设置闲置的连接数。 db.Ping() ...
go mysql增删改查 实例代码1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798package mainimport ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql")func checkErr(err error) { if err != nil{ panic(err) }}func main() { db , err := sql.Open("mysql","root:@tcp(127.0.0.1:3306)/test") /** 连接参数 ...
title : go printf用法category : gotag : gogo printf用法1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889package mainimport ( "fmt" "os" "io")type point struct { x , y int}func main() { p := point{1,2} //%v 输出结构体值 fmt.Printf("%v\n",p) //{1 2} //%+v 的格式化输出内容将包括结构体的字段名 fmt.Printf("%+v \n",p) // ...
go redis使用
简单链接使用12345678910111213141516171819 spec := redis.DefaultSpec().Db(0).Password(""); client, Rerr := redis.NewSynchClientWithSpec (spec); if Rerr != nil { fmt.Println("Connect redis server fail") return } dbkey := "test"; value :=[]byte("Hello world!"); client.Set(dbkey, value); getValue ,err:= client.Get(dbkey); if err != nil { fmt.Println("Get Key fail") return } else { str := string(getValue); fmt.Print ...