Golang 特性简介

by sheepbao

主要大概介绍go语言的历史和特性,简单的入门。

来历

很久以前,有一个IT公司,这公司有个传统,允许员工拥有20%自由时间来开发实验性项目。在2007的某一天,公司的几个大牛,正在用c++开发一些比较繁琐但是核心的工作,主要包括庞大的分布式集群,大牛觉得很闹心,后来c++委员会来他们公司演讲,说c++将要添加大概35种新特性。这几个大牛的其中一个人,名为:Rob Pike,听后心中一万个xxx飘过,“c++特性还不够多吗?简化c++应该更有成就感吧”。于是乎,Rob Pike和其他几个大牛讨论了一下,怎么解决这个问题,过了一会,Rob Pike说要不我们自己搞个语言吧,名字叫“go”,非常简短,容易拼写。其他几位大牛就说好啊,然后他们找了块白板,在上面写下希望能有哪些功能(详见文尾)。接下来的时间里,大牛们开心的讨论设计这门语言的特性,经过漫长的岁月,他们决定,以c语言为原型,以及借鉴其他语言的一些特性,来解放程序员,解放自己,然后在2009年,go语言诞生。

思想

Less can be more

大道至简,小而蕴真

让事情变得复杂很容易,让事情变得简单才难

深刻的工程文化

优点

  1. 自带gc。
  2. 静态编译,编译好后,扔服务器直接运行。
  3. 简单的思想,没有继承,多态,类等。
  4. 丰富的库和详细的开发文档。
  5. 语法层支持并发,和拥有同步并发的channel类型,使并发开发变得非常方便。
  6. 简洁的语法,提高开发效率,同时提高代码的阅读性和可维护性。
  7. 超级简单的交叉编译,仅需更改环境变量。(花了我两天时间编译一个imagemagick到arm平台)
  8. 内含完善、全面的软件工程工具。Go语言自带的命令和工具相当地强大。通过它们,我们可以很轻松地完成Go语言程序的获取、编译、测试、安装、运行、运行分析等一系列工作,这几乎涉及了开发和维护一个软件的所有环节。

hello

package mainfunc main() {println("hello, sewise")
}

type

主要讲讲特有的类型,其他基本类型不做介绍

slice

切片:可以理解为动态数组,类似c++的vector 声明一个slice

 var slice []T// 如:var ints []int

slice的追加

ints = append(ints, 1)
ints = append(ints, 2, 3, 4, 5)

slice的截取

newInts1 := ints[2:3]
newInts2 := ints[2:]
newInts3 := ints[:4]

map

字典:键值对

var json map[string]string

interface

接口:方法的集合,是一种合约 栗子: 声明一个bird接口

var bird interface {fly()
}

声明一个hen对象(实现bird接口)

type hen struct {weight inthasFeather bool
}func (h hen) fly() {fmt.Println("iI can fly")
}func (h hen) eat() {h.weight++fmt.Println("yes, I can eat")
}

声明一个 pig 对象(未实现 bird 接口,因为 pig 不会 fly)

type pig struct {age intweignt inthasFeather bool
}func (p pig) run() {fmt.Println("I can run")
}func (p pig) eat() {p.weight += 100fmt.Println("Yes, I can eat so much")
}func (p pig)sleep(){fmt.Println("I slept all my life")
}// pig can't fly

channel

通道:轻量集队列,传递某种类型的值的通道

var ch chan int
ch = make(chan int, 1)

往ch写入一个数据

ch<- 8888

从ch读取数据

out := <-ch

特性: channel是有长度的,当channel的缓冲为满时,再往里写入就会阻塞,当channel的缓冲为空时,从channel读就会阻塞

package mainimport ("fmt""time"
)func main() {ch := make(chan int)fmt.Println("ch len:", len(ch))go func() {// 往缓冲满的channel里写数据(阻塞)// ch <- 1// 从缓冲为空的channel里读数据(阻塞)<-chfmt.Println("I am in minor goroutine")}()fmt.Println("I am in main goroutine")time.Sleep(2 * time.Second)
}

当长度为 0 是,就是不带缓冲的 channel 长度大于0,就是带缓冲的 channel

并发

关键字:go 启动 go 程 一个普通的函数或方法调用前加上关键字 go,即可启动一个 goroutine

go func() {fmt.Println("start func")time.Sleep(120*time.Second)
}()

竞争条件检测 -race race.go

package mainimport ("fmt""time"
)func main() {a := 1go func() {a = 2}()a = 3fmt.Println("a is ", a)time.Sleep(2 * time.Second)
}

检测:执行go run -race race.go

a is  3
==================
WARNING: DATA RACE
Write at 0x00c420072188 by goroutine 6:main.main.func1()/Users/bao/program/go/gowork/hello/src/research/race.go:11 +0x3bPrevious write at 0x00c420072188 by main goroutine:main.main()/Users/bao/program/go/gowork/hello/src/research/race.go:13 +0x9fGoroutine 6 (running) created at:main.main()/Users/bao/program/go/gowork/hello/src/research/race.go:12 +0x8e
==================
Found 1 data race(s)

结果分析: goroutine6运行到第11行和main goroutine运行到13行的时候触发竞争了。而且goroutine6是在第12行的时候产生的。

package

包的管理,关键字import,GOPATH

gopath

gopath是一个路径列表,存放go项目工程 GOPATH文件目录结构

├── bin  二进制文件目录
├── pkg  编译好的库文件目录
└── src  源码目录  

平常项目的目录结构

├── bin  二进制文件目录
├── pkg  编译好的库文件目录
└── src  源码目录├── main  入口函数目录└── vendor  当前项目的库目录└── sheepbao.com└── glog

import

比如上面的项目,我要在main.go引入glog包

package main// 引入glog包
import "sheepbao.com/glog"func main() {glog.Println("test")
}

go的工程工具简介

test

go的命令工具 test,用来做测试

单元测试

go test 只测试函数名被它正确匹配的测试函数 go test -v -run="French|Canal"

栗子: add.go

package testfunc addOne(i int) int {return i + 1
}

add_test.go

package testimport "testing"func TestAddOne(t *testing.T) {result := addOne(1)if result != 2 {t.Error("1+1!=2")}
}
bao@baoMac test$ go test -v .
=== RUN   TestAddOne
--- PASS: TestAddOne (0.00s)
PASS
ok      _/Users/bao/program/go/gowork/hello/src/research/test   0.006s

基准测试

go test -bench=. 内存的分配情况 go test -bench=FuncName -benchmem 栗子: stringsCon.go

package benchimport ("fmt"
)func Sprintf(s1, s2, s3 string) string {return fmt.Sprintf("%s%s%s", s1, s2, s3)
}func AddString(s1, s2, s3 string) string {return s1 + s2 + s3
}

stringCon_test.go

package benchimport "testing"var (s1 = "make it run!"s2 = "make it right!"s3 = "make it fast!"
)func BenchmarkSprintf(b *testing.B) {for i := 0; i < b.N; i++ {Sprintf(s1, s2, s3)}
}func BenchmarkAddString(b *testing.B) {for i := 0; i < b.N; i++ {AddString(s1, s2, s3)}
}

go test -bench=.

bao@baoMac bench$ go test -bench=.
testing: warning: no tests to run
BenchmarkSprintf-4       5000000               349 ns/op
BenchmarkAddString-4    20000000                61.7 ns/op
PASS
ok      _/Users/bao/program/go/gowork/hello/src/research/bench  3.414s

样本测试

package etimport ("fmt"
)func ExampleHello() {fmt.Println("hello, sewise")// Output: hello, sewise
}
bao@baoMac example$ go  test -v .
=== RUN   ExampleHello
--- PASS: ExampleHello (0.00s)
PASS
ok      _/Users/bao/program/go/gowork/hello/src/research/example        0.006s

如果把上面的// Output: hello, sewise改为// Output: hello, sewis 则样本测试不能通过

bao@baoMac example$ go  test -v .
=== RUN   ExampleHello
--- FAIL: ExampleHello (0.00s)
got:
hello, sewise
want:
hello, sewis
FAIL
exit status 1
FAIL    _/Users/bao/program/go/gowork/hello/src/research/example        0.006s

pprof

go的命令工具 pprof,用来性能分析(内存使用,泄露和cpu消耗) go tool pprof

  • 查看cpu使用: go tool pprof http://localhost:8089/debug/pprof/profile 终端查看:

可视化(原是svg文件,下图为截图):

  • 查看内存使用 go tool pprof http://localhost:8089/debug/pprof/heap 终端查看: 

可视化(原是 svg 文件,下图为截图:

go tool pprof --text http://localhost:6060/debug/pprof/heap

go命令教程

资料

http://www.csdn.net/article/2012-07-04/2807113-less-is-exponentially-more

http://www.jianshu.com/p/91e40c3e3acb?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io

http://smallsoho.com/2016/11/20/Go简明教程.html?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io

大牛真身

最大牌的当属B和C语言设计者、Unix和Plan 9创始人、1983年图灵奖获得者Ken Thompson,这份名单中还包括了Unix核心成员Rob Pike(go语言之父)、java HotSpot虚拟机和js v8引擎的开发者Robert Griesemer、Memcached作者Brad Fitzpatrick,等等。

功能

  • 规范的语法(不需要符号表来解析)
  • 垃圾回收(独有)
  • 无头文件
  • 明确的依赖
  • 无循环依赖
  • 常量只能是数字
  • int和int32是两种类型
  • 字母大小写设置可见性(letter case sets visibility)
  • 任何类型(type)都有方法(不是类型)
  • 没有子类型继承(不是子类)
  • 包级别初始化以及明确的初始化顺序
  • 文件被编译到一个包里
  • 包package-level globals presented in any order
  • 没有数值类型转换(常量起辅助作用)
  • 接口隐式实现(没有“implement”声明)
  • 嵌入(不会提升到超类)
  • 方法按照函数声明(没有特别的位置要求)
  • 方法即函数
  • 接口只有方法(没有数据)
  • 方法通过名字匹配(而非类型)
  • 没有构造函数和析构函数
  • postincrement(如++i)是状态,不是表达式
  • 没有preincrement(i++)和predecrement
  • 赋值不是表达式
  • 明确赋值和函数调用中的计算顺序(没有“sequence point”)
  • 没有指针运算
  • 内存一直以零值初始化
  • 局部变量取值合法
  • 方法中没有“this”
  • 分段的堆栈
  • 没有静态和其它类型的注释
  • 没有模板
  • 内建string、slice和map
  • 数组边界检查

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457248.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为2017java笔试题_2017年java华为面试题

2017年java华为面试题通过HCNP认证&#xff0c;将证明您对中小型网络有全面深入的了解&#xff0c;掌握中小型网络的通用技术&#xff0c;并具备独立设计中小型网络以及使用华为路由交换设备实施设计的能力。下面是小编收集的关于java华为面试题&#xff0c;希望大家认真阅读!1…

java框架概念_java概念(2)

java概念(2)重载和重写重载&#xff1a;同一个类中&#xff0c;方法名相同&#xff0c;参数不同重写&#xff1a;父子类中&#xff0c;子类重新定义父类的方法多态​ 多态&#xff1a;同一种行为&#xff0c;不同的对象有不同的表现形式。​ 重载 编译时根据参数决定调用的方法…

CentOS(八)--crontab命令的使用方法

crontab命令常见于Unix和Linux的操作系统之中&#xff0c;用于设置周期性被执行的指令。该命令从标准输入设备读取指令&#xff0c;并将其存放于"crontab"文件中&#xff0c;以供之后读取和执行。 在Linux系统中&#xff0c;Linux任务调度的工作主要分为以下两类&…

有健忘症吗?

今天兴高采烈&#xff0c;早上空气不错&#xff0c; 但是骑自行车的我&#xff0c;还是得戴一个面罩。 半个小时后买了早餐&#xff0c; 一份炒粉、一豆浆&#xff0c;今天早上豆浆没有掉地上&#xff0c; 但是~~~~~~~~~~~~~~shit~~!~!~,居然忘记带要换的衣服了&#xff0c; …

下载java后缀的文件闪退_关于jarfile 打开闪退问题

后面才发现&#xff0c;原来是因为我把文件拖入了新建的文件夹&#xff0c;改变了路径&#xff0c;而且我的java环境没有配置好是全局变量&#xff0c;所以新建文件夹之后&#xff0c;就会出现找不到了路径&#xff0c;闪退的问题&#xff0c;&#xff0c;&#xff0c;还有就是…

java怎样写入五个人的成绩_用java输入5个学员姓名和分数,显示分数最高的学员姓名和分数?...

展开全部import java.util.Scanner;public class Student {private String stuname "";private float stuscore 0;public String getStuname() {e69da5e6ba9062616964757a686964616f31333335316633return stuname;}public void setStuname(String stuname) {this.s…

iOS 10 升级后无法真机测试 Could not find Developer Disk Image

&#xff0d;&#xff0d;&#xff0d;2016年9月20日更新 iOS 升级到10之后&#xff0c;你会发现无法进行真机测试了。这种情况我在iOS 8.4 、9.3更新的时候也遇到过。原因是Xcode 的DeviceSupport里面缺少了iOS 10的SDK。所以你可以选择将Xcode更新到最新版本就可以了&#xf…

java虚拟机参数优化_JAVA虚拟机JVM参数优化(2):垃圾收集算法选择

JAVA虚拟机JVM优化重要性&#xff0c;昨天JAVA虚拟机JVM参数优化(1)文章中已经描述&#xff0c;今天我们来讨论JAVA虚拟机在不同性能要求下如何选择三种垃圾收集算法。JVM内部结构如下图所示&#xff1a;串行收集用于单个线程执行垃圾收集的情况&#xff0c;在这种情况下相对它…

Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)

2019独角兽企业重金招聘Python工程师标准>>> 互联网的发展&#xff0c;网站应用的规模不断扩大&#xff0c;常规的垂直应用架构已无法应对&#xff0c;分布式服务架构以及流动计算架构势在必行&#xff0c;Dubbo是一个分布式服务框架&#xff0c;在这种情况下诞生的…

java clicked_关于java:JComponents在调用mouseClicked()之后消失

我正在用Swing编写Java GUI程序。该界面如下所示&#xff1a;当用户单击右侧的图片之一时&#xff0c;我希望它的一个小的预览显示在左上角的橙色区域中。我通过SwingWorker线程从计算机上的目录中提取所有图像文件。在SwingWorker的done()方法中&#xff0c;我向每个对象添加了…

vim简单命令教程-firstblood

你想以最快的速度学习人类史上最好的文本编辑器VIM吗&#xff1f;你先得懂得如何在VIM幸存下来&#xff0c;然后一点一点地学习各种戏法。 Vim the Six Billion Dollar editor Better, Stronger, Faster. 学习 vim 并且其会成为你最后一个使用的文本编辑器。没有比这个更好的文…

第三课、Qt的诞生和本质------------------狄泰软件学院

一、GUI用户界面元素 &#xff08;1&#xff09;、GUI应用程序是由固定的窗口元素所构成 &#xff08;2&#xff09;、操作系统提供了创建用户界面元素所需要的函数 &#xff08;3&#xff09;、各自功能不同的函数依次调用&#xff0c;从而创建出界面元素 &#xff08;4&#…

Spark RDD算子介绍

Spark学习笔记总结 01. Spark基础 1. 介绍 Spark可以用于批处理、交互式查询&#xff08;Spark SQL&#xff09;、实时流处理&#xff08;Spark Streaming&#xff09;、机器学习&#xff08;Spark MLlib&#xff09;和图计算&#xff08;GraphX&#xff09;。 Spark是MapReduc…

java 写tb级文件_三管齐下!TB 级文件的上传性能瞬间被优化 100 倍!

作者 | 中华石杉责编 | 伍杏玲本文经授权转载石杉的架构笔记(ID&#xff1a;shishan100)这篇文章我们来看看&#xff0c;世界上最优秀的分布式文件系统HDFS&#xff0c;是如何对超大文件的上传做性能优化的&#xff1f;首先&#xff0c;我们还是通过一张图来看一下文件上传的大…

CentOS7下安装Redis — 单节点

2019独角兽企业重金招聘Python工程师标准>>> 1. 环境准备 安装编译所需要的包&#xff1a; yum install gcc tcl 2. 下载redis http://download.redis.io/releases/redis-3.2.7.tar.gz 3. 安装redis ## 创建redis的安装目录 mkdir /usr/local/redis## 解压redis tar…

笔记本中美化代码的方法

这里向大家推荐一个很好用的记笔记软件,微软的OneNote,这个笔记软件,支持分区和分区组的创建,而且入门简单,界面简洁,很适合从word过渡过来的人来记笔记! 不过如果直接记笔记,对于程序员来说,可能希望代码在笔记本上更好看一些,那么应该怎么办呢?下面提供了在OneNote中,让代码…

工具使用——印象(汇总)

作者&#xff1a;桂。 时间&#xff1a;2017-02-09 23:11:30 链接&#xff1a;http://www.cnblogs.com/xingshansi/articles/6384097.html 说明&#xff1a;转载请注明出处&#xff0c;谢谢。 前言 本文仅仅介绍印象笔记的使用&#xff0c;至于挖掘机哪家强&#xff0c;本文不…

深入理解Python的logging模块:从基础到高级

在Python编程中&#xff0c;日志记录是一种重要的调试和错误追踪工具。Python的logging模块提供了一种灵活的框架&#xff0c;用于发出日志消息&#xff0c;这些消息可以被发送到各种输出源&#xff0c;如控制台、文件、HTTP GET/POST位置等。本文将深入探讨Python的logging模块…

centos7安装java6_CentOS7.6安装jdk1.8

2、登录Linux服务器&#xff0c;通过rz命令将jdk导入服务器如果没有rz命令 需要先安装lrzszyum install lrzsz -y3、将jdk压缩包解压到指定路径 -C 指定路径4、配置环境变量编辑/etc/profile文件 在末尾加上以下内容 wq保存退出source /etc/profile文件 使配置文件生效export J…