go语言

GO语言-Redis 连接池

大兔子大兔子 提交于 2021-01-03 17:30:17
自留笔记:从beego中分离出来的 //file name: redis.go package conn import ( // "fmt" "github.com/garyburd/redigo/redis" ) var MAX_POOL_SIZE = 20 var redisPool chan redis.Conn func putRedis(conn redis.Conn) { if redisPool == nil { redisPool = make(chan redis.Conn, MAX_POOL_SIZE) } if len(redisPool) >= MAX_POOL_SIZE { conn.Close() return } redisPool <- conn } func InitRedis(network, address string) redis.Conn { redisPool = make(chan redis.Conn, MAX_POOL_SIZE) if len(redisPool) == 0 { go func() { for i := 0; i < MAX_POOL_SIZE/2; i++ { c, err := redis.Dial(network, address) if err != nil { panic(err) } putRedis

Go语言学习笔记(语法篇)

我是研究僧i 提交于 2020-04-24 05:38:39
Go语言的控制结构比Java、C语言都要少,只有很简单的几个,语法与也略有不同。 Go语言的保留关键字 break default func interface select case defer go map struct chan else goto package switch const fallthrough if range type continue for import return var 运算符 * / % << >> & &^ + - | ^ && || ! if if中的条件不需要用中括号()给包含起来。 a := 1 b := 2 c := 3 if a < b && b < c { fmt.Println(true) } else { fmt.Println(false) } 而且if接受初始化语句,初始化的变量为一个局部变量。 if f, err := os.Open("c:/hello.go"); err == nil { fmt.Println(f.Name()) } else { fmt.Println(err) } goto 在Java里这是一个保留关键字,但没有任何实际作用。goto用不好容易造成程序的逻辑混乱。下面用Lable标识一个标签,goto可以将执行跳转到这个标签位置,注意标签是大小写敏感的。 func myfunc() { i :

go语言系列-TCP编程

早过忘川 提交于 2020-04-07 21:14:59
TCP编程 Go的主要设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端,程序必不可少也是至关重要的一部分 网络编程基本介绍 网络编程有两种 TCP socket编程,是网络编程的主流。之所以叫Tcp socket 编程,是因为底层基于Tcp/ip协议的。比如:QQ聊天 b/s结构的http编程,使用浏览器去访问服务器时,使用的就是http协议,而http底层依旧是用tcp socket实现的。比如:京东商城【属于go web开发范畴】 计算机间要相互通讯,必须要是用网线、网卡或者无线网卡 协议(tcp/ip) TCP/IP(Transmission Control Protocol/Internet Protocol)的简写,中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是Internet最基本的协议、Internet国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的 OSI与TCP/IP参考模型 书籍推荐《tcp/ip协议3卷》 IP地址 每个internet上的主机和路由器都有一个ip地址,它包括网络号和主机号,ip地址有ipv4(32位)或者ipv6(128位)可以ipconfig查看 端口(port)-介绍 这里所指的端口不是指物理意义上的端口,而是特指TCP/IP协议中的端口,是逻辑意义上的端口

Go语言规范(类型)

百般思念 提交于 2020-04-07 12:30:10
原文: http://golang.org/doc/go_spec.html 翻译: 红猎人 (zengsai@gmail.com) Boolean types 布尔类型 A boolean type represents the set of Boolean truth values denoted by the predeclared constants true and false . The predeclared boolean type is bool . 布尔类型由预定义的常量 true 和 false 组成,预定义的布尔类型是 bool。 Numeric types 数字类型 A numeric type represents sets of integer or floating-point values. The predeclared architecture-independent numeric types are: 数字类型代表一个数字或浮点值的集合。预定义的类型是: uint8 the set of all unsigned 8-bit integers (0 to 255) uint16 the set of all unsigned 16-bit integers (0 to 65535) uint32 the set of all

格鲁巴四大殊胜之Golang篇

一世执手 提交于 2020-04-07 11:01:36
这样的比较,在于通过分析Golang的过程,引导分析理解格鲁巴的四大殊胜,因为分析的过程是类似的。 ** 这里老师也概括了菩提道次第教授的四大殊胜,那么是哪四大殊胜呢,我们一起往下看:** 第一个殊胜:通达一切圣教无违殊胜。 只要你学到朗忍,就不会产生以前那种感觉——总觉得佛法有矛盾,这个地方讲的和那个地方讲的正好是矛盾,修不起来——不会有这种感觉。互相之间,你就知道,佛在不同的位置、为不同的众生、不同的机缘所说。 那为什么说相互之间没有矛盾呢,为什么一切圣教无违?这就好比我们学的三士道,我们在下士的时候讲善业,纯是为了自利,为了增上,但到了上士道,假如是为了自受用,这个时候的发心做善业,不仅没有功德,可能还是为名利心所染污。所以,同样是行善,但在不同的根基的时候,发心不同,所讲的教言对机也是不一样的。 Go语言 多平台部署,通吃各大系统平台,win、Linux、Unix,通通可以运行,部署方便,跨平台编译,编译后复制过去立即运行。 于佛法启示: 佛法不得其门而入的时候,确实很庞杂,佛经这里的开示跟另一部佛经的开示不一样,祖师大德前面的开示跟后面的开示不一样,对这个人的开示与对那个人的开示不一样,各宗各派的开示差别很多,净土跟禅宗的简直势同水火了。 而通过道次第的学习,可以了达佛法各处对机开示的根本含义,了解净土与禅宗,各宗各派的要义,理会到佛教的精神。 第二个殊胜

Go语言规范(源代码表示)

痴心易碎 提交于 2020-04-07 07:45:28
原文: http://golang.org/doc/go_spec.html 翻译: 红猎人 (zengsai@gmail.com) Source code representation 源代码表示 [Top] Source code is Unicode text encoded in UTF-8 . The text is not canonicalized, so a single accented code point is distinct from the same character constructed from combining an accent and a letter; those are treated as two code points. For simplicity, this document will use the term character to refer to a Unicode code point. 源代码是用 UTF-8 编码 的 Unicode 文本。文本不是规范化的,因此一个单独加了重音的代码点有别于由字母和重音 结合而成的字符;它们对当作两个代码点对待。为了简单起见,该文档使用术语 字符 指代 Unicode 代码点。 Each code point is distinct; for instance, upper

go语言定义变量/类型的方式

*爱你&永不变心* 提交于 2020-04-07 01:13:40
1、数组 var array1 = [5]int{1, 2, 3} var array2 = [...]int{6, 7, 8} var array3 [5]int array4 := [5]int{1, 2, 3} array5 := new([3]int) 2、切片 切片可以通过数组构建,这里不讨论这种方式 var slice1 = []int{9, 10, 11, 12} slice2 := make([]int, 5) var slice3 []int slice2 := []int {元素1[, 元素2, ...]} 可以发现[]中有数字的是固定长度的数组,没有数字的表示切片 3、map // 先声明map var m1 map[string]string // 再使用make函数创建一个非nil的map,nil map不能赋值 m1 = make(map[string]string) // 直接创建 m2 := make(map[string]string) // 直接创建 // 初始化 + 赋值一体化 m3 := map[string]string{ "a": "aa", "b": "bb", } //创建+初始化 var m4 map[string][string]= make(map[string]string) map必须初始化才能使用,否则会报错 5、结构体

Go语言进阶学习笔记

╄→гoц情女王★ 提交于 2020-04-07 00:46:54
协程 创建时默认的 stack 的⼤⼩ JDK5 以后 Java Thread stack 默认为1M Groutine 的 Stack 初始化⼤⼩为2K 和 KSE (Kernel Space Entity 系统线程) 的对应关系 Java Thread 是 1:1 Groutine 是 M:N Thread 切换代价大 先说,协程的本质是用户态的线程,用户对其有控制权限,内存占用少,切换代价低。 再来解释一下MPG是什么意思。 M代表内核线程,所有的G都要放在M上才能运行。 P代表控制器,调度G到M上,其维护了一个队列,存储了所有需要它来调度的G。 G代表一个go routine单元。 补充几点常见的调度策略: 1,如果某个M陷入阻塞呢? 当一个OS线程M由于io操作而陷入阻塞,假设此时G0正跑在了M上,那么M上绑定的P就会带着余下的所有G去寻找新的M。当M恢复过来时,一般情况下,会从别的M上拿过来一个P,并把原先跑在其上的G0放到P的队列中,从而运行G0。如果,没有拿到可用的P的话,就把G0放入到全局global runqueue队列中,使G0等待被调度,然后M进入线程缓存。所有的P也会周期性的检查global runqueue并运行其中的goroutine,否则global runqueue上的goroutine永远无法执行。 2,如果有的M较忙,有的M较闲呢?

GO语言数组和切片实例详解

☆樱花仙子☆ 提交于 2020-04-06 23:10:26
一、数组   与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列。 (1)数组的创建。 数组有3种创建方式:[length]Type 、[N]Type{value1, value2, ... , valueN}、[...]Type{value1, value2, ... , valueN} 如下: 复制代码 代码如下: func test5() { var iarray1 [5]int32 var iarray2 [5]int32 = [5]int32{1, 2, 3, 4, 5} iarray3 := [5]int32{1, 2, 3, 4, 5} iarray4 := [5]int32{6, 7, 8, 9, 10} iarray5 := [...]int32{11, 12, 13, 14, 15} iarray6 := [4][4]int32{{1}, {1, 2}, {1, 2, 3}} fmt.Println(iarray1) fmt.Println(iarray2) fmt.Println(iarray3) fmt.Println(iarray4) fmt.Println(iarray5) fmt.Println(iarray6) } 结果: [0 0 0 0 0] [1 2 3 4 5] [1 2 3 4 5] [6 7 8 9 10] [11 12

go语言学习--go中闭包

大憨熊 提交于 2020-04-06 19:11:17
关于闭包有句话说的很好,闭包捕获的变量和常量是引用传递不是值传递。 Go语言支持匿名函数,即函数可以像普通变量一样被传递或使用。 使用方法如下: package main import ( "fmt" ) func main() { var v func(a int) int v = func(a int) int { return a * a } fmt.Println(v(6)) //两种写法 v1 := func(i int) int { return i * i } fmt.Println(v1(7)) }    GO语言的匿名函数就是闭包,以下是《GO语言编程》中对闭包的解释 基本概念 闭包是可以包含自由(未绑定到特定对象)变量的代码块,这些变量不在这个代码块内或者 任何全局上下文中定义,而是在定义代码块的环境中定义。要执行的代码块(由于自由变量包含 在代码块中,所以这些自由变量以及它们引用的对象没有被释放)为自由变量提供绑定的计算环 境(作用域)。 闭包的价值 闭包的价值在于可以作为函数对象或者匿名函数,对于类型系统而言,这意味着不仅要表示 数据还要表示代码。支持闭包的多数语言都将函数作为第一级对象,就是说这些函数可以存储到 变量中作为参数传递给其他函数,最重要的是能够被函数动态创建和返回。 一个函数和与其相关的引用环境,组合而成的实体: package main