《Go语言编程》读书笔记一

前言:
那么,互联网时代的C语言需要考虑哪些关键问题呢?
  • 首先,并行与分布式支持。多核化和集群化是互联网时代的典型特征。作为一个互联网时代 的C语言,必须要让这门语言操作多核计算机与计算机集群如同操作单机一样容易。 其次,软件工程支持。工程规模不断扩大是产业发展的必然趋势。单机时代语言可以只关心问题本身的解决,而互联网时代的C语言还需要考虑软件品质保障和团队协作相关的话题。 最后,编程哲学的重塑。计算机软件经历了数十年的发展,形成了面向对象等多种学术流派。
  • 什么才是最佳的编程实践?作为互联网时代的C语言,需要回答这个问题。
    • 第一个话题是并发执行的“执行体”。执行体是个抽象的概念,在操作系统层面有多个概念 与之对应,比如操作系统自己掌管的进程( process )、进程内的线程( thread )以及进程内的协程 coroutine ,也叫轻量级线程)。多数语言在语法层面并不直接支持协程,而通过库的方式支持的 协程的功能也并不完整,比如仅仅提供协程的创建、销毁与切换等能力。如果在这样的协程中调 用一个同步 IO 操作,比如网络通信、本地文件读写,都会阻塞其他的并发执行协程,从而无法真 正达到协程本身期望达到的目标。
    • Go 语言在语言级别支持协程,叫 goroutine Go 语言标准库提供的所有系统调用( syscall )操 作,当然也包括所有同步 IO 操作,都会出让 CPU 给其他 goroutine ,这让事情变得非常简单。
    • 第二个话题是“执行体间的通信”。执行体间的通信包含几个方式:
      •  执行体之间的互斥与同步
      •  执行体之间的消息传递
    • 先说“执行体之间的互斥与同步”。当执行体之间存在共享资源(一般是共享内存)时,为 保证内存访问逻辑的确定性,需要对访问该共享资源的相关执行体进行互斥。当多个执行体之间 的逻辑存在时序上的依赖时,也往往需要在执行体之间进行同步。互斥与同步是执行体间最基础 的交互方式。
    • 再说“执行体之间的消息传递”。在并发编程模型的选择上,有两个流派,一个是共享内存模型,一个是消息传递模型。多数传统语言选择了前者,少数语言选择后者,其中选择“消息传递模型”的最典型代表是Erlang语言。
    • Go语言推荐采用“Erlang风格的并发模型”的编程范式,尽管传统的“共享内存模型”仍然被保留,允许适度地使用。在Go语言中内置了消息队列的支持,只不过它叫通道(channel)。两个goroutine之间可以通过通道来进行交互。
  • Go语言很可能是第一个将代码风格强制统一的语言,例如Go语言要求public的变量必须以大写字母开头,private变量则以小写字母开头,这种做法不仅免除了public、private关键 字,更重要的是统一了命名风格。 另外,Go语言对{ }应该怎么写进行了强制。
  •  第1章 初识Go语言
  • 1.1 语言简史
  • 贝尔实验室、Google
  • 第一个正式版本的Go语言于2012 年3月28日正式发布,让Go语言迎来了第一个引人瞩目的里程碑。开源。
  • 1.2 语言特性
  • Go是静态类型开发语言
  • 特性:
  • 1.2.1 自动垃圾回收
  • 1.2.1 更丰富的内置类型
  • 1.2.3 函数多返回值
  • 1.2.4 错误处理
    • 3个关键字分别为defer、panic和recover
  • 1.2.5 匿名函数和闭包
    • 在Go语言中,所有的函数也是值类型,可以作为参数传递
  • 1.2.6 类型和接口
  • 1.2.7 并发编程
    • 主要是协程
  • 1.2.8 反射
  • 1.2.9 语言交互性
    • 调用C语言的代码:Cgo
  • 1.3 第一个go程序 
    • 当然是hello world
    • 《Go语言编程》读书笔记一_第1张图片
    • package import Println…很好,这很java
  • 1.3.1 代码解读
    • package声明该go代码所属的package
    • main函数不带参数不定义返回值,是入口点函数;命令行定义参数在os.Args变量汇总保存,后面会讲怎么用flag包来处理
    • import 导入依赖包;不得包含在源代码文件中没有用到的包,否则Go编译器会编译报错
    • 所有go函数以func关键字开头,定义格式:主要花括号必须这样(以前写C++还挺讨厌这种格式的,总感觉会找不到成对的括号…)
      • func 函数名(参数列表)(返回值列表) {
      • // 函数体
      • }
      • 并不是所有返回值都必须赋值。在函数返回时没有被明确赋值的返回值都会被设置为默认值
    • 注释:和C++一致
  • 1.3.2 编译环境准备
    • 查看是否有go环境: go version
    • 这里没展开讲,准备用ubuntu搭一下。
    • 按这篇文章里直接下载的release:http://blog.csdn.net/sunylat/article/details/50812998
    • 这还有篇文章,参考:http://www.cnblogs.com/Liar/p/3551080.html
    • 弄完了之后切换了用户,go version没用。提示我可以apt-get install,好气哦~不过注销一下这个用户就可以用了。
    • 其实家里因为网速慢,ubuntu连个vim装不上…呵呵
  • 1.3.3 编译程序
    • go run hello.go
    • 代码 编译+链接+运行
    • go build hello.go 
    • 只编译不运行
    • 编译器、连接器分开:(64位)
      • 6g hello.go
      • 6l hello.6
      • ./6.out
      • 对生成文件的名字略迷惑,想试一下,然后手上的环境找不到这俩命令…32位工具8g 8l我也试了,一放
      • 书上说 go 有gcc版本的编译器gccgo,本书不讨论。
  • 1.4 开发工具选择
    • 《Go语言编程》读书笔记一_第2张图片
    • 本书用gedit…我不会,准备直接vim
  • 1.5 工程管理
    • 早期Go语言使用makefile作为临时方案,到了Go 1发布时引入了Go命令行工具。
    • 实例:一个基于命令行的计算器程序
    • 《Go语言编程》读书笔记一_第3张图片
    • 《Go语言编程》读书笔记一_第4张图片
    • xxx_test.go 单元测试代码
    • 代码清单:Page28
    • 构建工程  
      • 按目录结构存放代码,工程文件下有src bin 和pkg目录。
      • 设置环境变量export GOPATH=home/username/calcproj
      • 可以添加到.bashrc里然后 运行 source .bashrc或者. .bashrc
      • GOPATH和PATH环境变量一样,也可以接受多个路径,并且路径和路径之间用冒号分割。
      • 切换到calcproj/bin目录下运行go build calc(我试了在calcproj内的其他位置运行就不成功)
    • 编译报错调整了一下之后,在bin目录下产生了calc程序。./calc运行
    • 运行成功后不管我后面跟啥参数,就会跳到执行USAGE。由于对语言也不是很熟悉,没心情调,先放着了。
    • 运行测试代码: go test simplemath
  • 1.6 问题追踪和调试
  • 1.6.1 打印日志
    • 用ftm包里的fmt.Println()和fmt.Prinf()
  • 1.6.2 GDB调试
    • go语言的二进制文件可以用GDB调试,运行”gdb 程序名“即可
  • 1.7 如何寻求帮助
  • 1.7.1 邮件列表
    • 英文:http://groups.google.com/group/golang-nuts
    • 中文 :http://groups.google.com/group/golang-china
    • Go语言服务端开发?http://groups.google.com/group/ecug
  • 1.7.2 网站资源
    • 官网(发布版): http://golang.org
    • 最新代码:http://code.google.com/p/go/
    • wiki:http://github.com/wonderfo/wonderfogo/wiki
  • 1.8 小结

转载于:https://www.cnblogs.com/nightcatcher/p/6204164.html

你可能感兴趣的:(《Go语言编程》读书笔记一)