golang

golang简介

只愿长相守 提交于 2019-11-27 01:09:42
GO语言是Google于2009年推出的一门新的系统编程语言 特点:   静态编译   垃圾回收   简洁的符号和语法   平坦的类型系统   基于CSP的并发模型   高效简单的工具链   丰富的标准库 为什么选择go语言 编译型语言,运行速度快 静态编译没有依赖 天生支持并发,充分利用多核 大厂支持,有后台 Hello World示例: package main //像Java一样必须指定package。 main表示二进制程序 improt "fmt" //引用fmt包 func main() { // func 相当于Python的 def 定义函数   fmt.Println("hello golang") //fmt表示格式化 Println 打印并换行 } HTTP版本Hello World package main import (   "fmt"   "net/http" ) func handler(w http.ResponseWriter, r *http.Request) {    //request表示请求的页面,response表示返回的页面,把要返回的内容写在response里面。 *表示指针 w表示参数,后面是类型。r也是参数,返回的是request类型   fmt.Fprintf(w, "Hello %s", r.URL.Path)    /

Golang 退出 goroutine的几种方式

不羁岁月 提交于 2019-11-26 22:31:30
传统方式 在刚开始学go的时候,没用过Context包,那么退出携程的方式一般有这么几种 使用携 chan 发送消息通知,这种一般只适合单个goroutine func exit01() { done := make(chan bool) go func() { for { select { case <-done: fmt.Println("退出携程") return default: fmt.Println("监控中...") time.Sleep(1 * time.Second) } } }() time.Sleep(3 * time.Second) done <- true time.Sleep(5 * time.Second) fmt.Println("程序退出") } 使用关闭 chan 的方式通知多个goroutine退出 func exit02() { done :=make(chan bool) go func() { for{ select { case <-done: fmt.Println("退出携程01") return default: fmt.Println("监控01...") time.Sleep(1*time.Second) } } }() go func() { for res :=range done{ //没有消息阻塞状态,chan关闭

(一)Golang的概述

烈酒焚心 提交于 2019-11-26 21:09:47
Google创造Golang的原因: 计算机硬件技术更新频繁,性能提高很快。目前主流的编程语言发展明显落后于硬件,不能合理利用多核多CPU的优势提升软件系统性能。 软件系统复杂度越来越高,维护成本越来越高,目前缺乏一个足够简洁高效的编程语言。【现有的编程语言;风格不统一;计算能力不够;处理大并发不够好】 企业运行维护很多c/c++的项目,c/c++程序运行速度虽然很快,但是编译速度却很慢,同时还存在“内存泄漏”的一系列的困扰需要解决。 Golang的发展历程: 2007年,谷歌工程师Rob Pike,Ken Thomson和Robert Griesemer开始设计一门全新的语言,这是Go语言的最初原型。 2009年11月10日,Google将Go语言以开放源代码的方式向全球发布。 2015年8月19日,Go1.5版发布,本次更新中移除了“最后残余的C代码”。 2017年2月17日,Go语言Go1.8版发布。 2017年8月24日,Go语言Go1.9版发布。1.9.2版本 2018年2月16日,Go语言Go1.10版发布。 Golang语言的特点: Go语言保证了既能达到静态编译语言的安全和性能,又能达到动态语言开发维护的高效率;相当于Go=C+Python,说明Go语言既有C静态语言程序的运行速度,又能达到Python动态语言的快速开发。 从语言中继承了很多理念,包括表达式语法

Golang学习 - path/filepath 包

狂风中的少年 提交于 2019-11-26 20:22:45
------------------------------------------------------------   filepath 中的函数会根据不同平台做不同的处理,比如路径分隔符、卷名等。 ------------------------------------------------------------ 路径分隔符转换: const ( Separator = os.PathSeparator // 路径分隔符(分隔路径元素) ListSeparator = os.PathListSeparator // 路径列表分隔符(分隔多个路径) )   下面两个函数主要用于将 Windows 路径分隔符转换为 Linux 路径分隔符,处理完后再转换回去,只在 Windows 中有用,在 Linux 中没必要: // 将 path 中平台相关的路径分隔符转换为 '/' ToSlash(path string) string // 将 path 中的 '/' 转换为系统相关的路径分隔符 FromSlash(path string) string func main() { s := `http://www.site.com/a/b/c/d` u, _ := url.Parse(s) s = u.Path // 下面这句用于 Windows 系统 s = filepath

[转载] 你不得不知的Golang线程模型

送分小仙女□ 提交于 2019-11-26 20:01:22
原著:翟陆续(加多) 资深Java , 著Java并发编程之美 一、前言 本节我们来探讨Go的线程模型,首先我们先来回顾下常见的三种线程模型,然后在介绍Go中独特的线程模型。 二、三种线程模型 线程的并发执行是有操作系统来进行调度的,操作系统一般都都在内核提供对线程的支持。而我们在使用高级语言编写程序时候创建的线程是用户线程,那么用户线程与内核线程是什么关系那?其实下面将要讲解的三种线程模型就是根据用户线程与内核线程关系的不同而划分的。 2.1 一对一模型 这种线程模型下用户线程与内核线程是一一对应的,当从程序入口点(比如main函数)启动后,操作系统就创建了一个进程,这个main函数所在的线程就是主线程,在main函数内当我们使用高级语言创建一个用户线程的时候,其实对应创建了一个内核线程,如下图: 这种线程模型优点是在多处理器上,多个线程可以真正实现并行运行,并且当一个线程由于网络IO等原因被阻塞时候,其他的线程不受影响。 缺点是由于一般操作系统会限制内核线程的个数,所以用户线程的个数会受到限制。另外由于用户线程与系统线程一一对应,当用户线程比如执行Io操作(执行系统调用)时候,需要从用户态的用户程序的执行切换到内核态执行内核操作,然后等执行完毕后又会从内核态切换到用户态执行用户程序,而这个切换操作开销是相对比较大的。

[喵咪Golang(2)]安装和Helloworld

北城以北 提交于 2019-11-26 16:46:33
#[喵咪Golang(2)]安装和Helloworld# ##前言## 哈喽大家好啊!今天我们紧接着来学习关于Go语言的安装和使用Go打印出helloworld,本节内容将会讲解关于Go语言在Liunx下怎么安装,环境变量怎么配置分别起到了什么作用,然后我们把go运行起来并且打印出helloworld,那么就开始今天的Go语言之旅吧! 附上: 喵了个咪的博客: w-blog.cn phalgo地址: github.com/wenzhenxi/phalgo Go语言圣经: docs.ruanjiadeng.com/gopl-zh ##1. 安装Go语言 Go语言支持多种操作系统,windows,Mac OS X,Liunx,Liunx下支持amd64、386、arm架构,windows和Mac OS X只支持amd64和386. 笔者在这里使用的是Liunx环境Centos6.5-64位系统,为什么使用Liunx也不用多说,但是为了使用友好的提示和自动补全功能会在windows下进行开发在Liunx下面运行,这会在稍后的章节进行讲解. 首先第一步我们肯定要把Go的代码包下载下来,如果去google下的话会有墙的问题这里推荐 Golang中国 提供下载,我们可以下载最新版本的也就是1.6.2的Go语言包: http://www.golangtc.com/download

Golang理解-数组和切片

守給你的承諾、 提交于 2019-11-26 16:22:34
数组 数组Go中定义及特点 数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。 因为 数组的长度是固定的 ,因此在Go语言中很少直接使用数组。 和数组对应的类型是Slice(切片),它是可以增长和收缩动态序列,slice功能也更灵活,但是要理解slice工作原理的话需要先理解数组。 默认情况下,数组的每个元素都被初始化为元素类型对应的零值,对于数字类型来说就是0。我们也可以使用数组字面值语法用一组值来初始化数组: var q [3]int = [3]int{1, 2, 3} var r [3]int = [3]int{1, 2} fmt.Println(r[2]) // "0" 在数组字面值中,如果在数组的长度位置出现的是“...”省略号,则表示数组的长度是根据初始化值的个数来计算。因此,上面q数组的定义可以简化为 q := [...]int{1, 2, 3} fmt.Printf("%T\n", q) // "[3]int" 数组的长度是数组类型的一个组成部分 ,因此[3]int和[4]int是两种不同的数组类型。数组的长度必须是常量表达式,因为数组的长度需要在编译阶段确定。 我们将会发现,数组、slice、map和结构体字面值的写法都很相似。上面的形式是直接提供顺序初始化值序列,但是也可以指定一个索引和对应值列表的方式初始化,就像下面这样:

Golang goquery

倾然丶 夕夏残阳落幕 提交于 2019-11-26 15:08:27
goquery地址: https://github.com/PuerkitoBio/goquery 还需要下载两个goquery需要用的包: https://github.com/andybalholm/cascadia https://golang.org\x\net\html golang.org这个被墙, 可以使用镜像: https://github.com/golang/net 一、元素、ID选择: import( "fmt" "log" "github.com/PuerkitoBio/goquery" ) func main(){ url:="http://www.baidu.com" dom,err:=goquery.NewDocument(url) if err != nil { log.Fatalln(err) } //使用find()函数查找元素"div"、类".class"或ID"#id", 并使用Each遍历所有匹配结果赋值给selection, dom.Find("div").Each(func(i int, selection *goquery.Selection){ fmt.Println(selection.Text()) } } 来源: https://www.cnblogs.com/xsly/p/10990350.html

golang中表格驱动测试

≡放荡痞女 提交于 2019-11-26 14:23:31
我们都知道,java中编写测试用例中多数使用断言,传入两个参数(期望值,实际值)进行进行对比,如下: Assert.assertEquals(int expected, int actual) 如果对比一致,继续执行。若不一致,会中断测试,抛出相应的异常。 go中简便测试方法:表格驱动测试。 什么是表格驱动测试? 个人认为,表格驱动测试是一种使用匿名结构体,把数据和逻辑处理完全分离的测试方法。 示例如下:我写的比较简单,a b两个数相乘 测试用例: 如下图,匿名结构体中a,b为入参,c为测试期望值 (结构体中只放数据) 。 range方法中遍历数组,调用方法进行对比 (方法中只处理逻辑) 。 有数据错误的运行效果: 我写的第三条测试数据是错误的,仔细看下图,期望数据忘记了也没关系。 (可以打印出正确的值) 。 数据都正确的效果: 也可以命令行运行: 切换到测试类所在目录下,运行:go test . 注意: 测试类命名:xxx_test 方法名以Test开头 导入t *testing.T包 来源: https://blog.csdn.net/weixin_43770545/article/details/98884540

(目录)设计模式(可复用面向对象软件的基础)

时光怂恿深爱的人放手 提交于 2019-11-26 12:04:34
本系列“设计模式”博客使用Golang语言实现算法。 所谓算法是指解决一个问题的步骤,个人觉得不在于语言。小弟只是最近学习Golang,所以顺带熟练一下语法知识,别无它意。 本系列博客主要介绍常见的23种设计模式,其内容顺序如下: 一、设计模式分类及设计原则 二、 工厂方法模式(Factory Method) 三、抽象工厂模式( Abstract Factory) 四、单例模式(Singleton) 五、建造者模式(Builder) 六、原型模式(Prototype) 七、适配器模式(Adapter) 八、装饰器模式(Decorator) 九、代理模式(Proxy) 十、外观模式(Facade) 十 一 、桥接模式(Bridge) 十二、组合模式(Composite) 十三、享元模式(Flyweight) 十四、策略模式(Strategy) 十五、模板方法模式(Template Method) 十六、观察者模式(Observer) 十七、迭代子模式(Iterator) 十八、责任链模式(Chain of Responsibility) 十九、命令模式(Command) 二十、备忘录模式(Memento) 二十一、状态模式(State) 二十二、访问者模式(Visitor) 二十三、中介者模式(Mediator) 二十四、解释器模式(Interpreter) 二十五、