Go语言特色

  • 简洁、快速、安全
  • 并行、有趣、开源
  • 内存管理、数据安全、编译迅速

Go语言用途

Go语言被设计成一门应用于搭载Web服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。对于高性能分布式系统领域而言,Go语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务器的开发而言是再好不过了。

第一个Go程序

  1. package main
  2. import "fmt"
  3. func main(){
  4. /* 这是我的第一个Go程序 */
  5. fmt.PrintIn("Hello, World!")
  6. }

代码解释:

  • 第一行代码package main定义了包名,必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package main。package main表示一个可独立执行的程序,每个Go应用程序都包含一个名为main的包;
  • import "fmt"告诉Go编译器这个程序需要使用fmt包(的函数或其他元素),fmt包实现了格式化IO(输入/输出)的函数;
  • func main()是程序开始执行的函数。main函数是每个可执行程序必须包含的,一般来说都是在启动后第一个执行的函数(如果有init()函数则会先执行该函数);
  • /* ... /是注释,在程序执行时将被忽略。单行注释是最常见的注释形式,可以使用//开头的单行注释。多行注释也叫块注释,均已/开头,并以*/结尾,切不可嵌套使用,多行注释一般用于包的文档描述或注释成块的代码片段;
  • fmt.PrintIn(...)可以将字符串输出到控制台,并在最后自动增加换行字符\n,使用fmt.Print("Hello, World!\n")可以得到相同的结果。Print和PrintIn这两个函数也支持使用变量,如:fmt.PrintIn(arr)。如果没有特别指定,它们会以默认的打印格式将变量arr输出到控制台;
  • 当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,比如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的public);标识符如果以小写字母开头,则对包外是不可见的,但是它们在整个包的内不时可见并可用的(像面向对象语言中的protected);

Go语言特性

自动垃圾回收

  • 内存自动回收,无序开发人员管理内存;
  • 开发人员只需专注业务实现;

高并发

  • 使用"协程",对原生并发的支持;
  • 基于CSP模型实现并发,其核心概念:不要通过共享内存来通信,而应该通过通信来共享内存;

关于高并发的简单演示:

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. )
  6. func test_print(a int) {
  7. fmt.Println(a)
  8. }
  9. func main() {
  10. for i:=0;i < 100 ;i++ {
  11. go test_print(i)
  12. }
  13. time.Sleep(time.Second)
  14. }

实现高并发的时候只需要在调用的函数前面加上go,就表示开启了并发;如果在for循环的外面不加上time.Sleep(time.Second),就会发现少打印了,这是因为当主线程运行完之后,并不会等待线程,所以程序直接终止。

channel管道

类似Linux的pipe,多个goroute之间通过channel进行通信,支持任何类型;

  1. package main
  2. import "fmt"
  3. func test_pipe() {
  4. pipe := make(chan int, 3)
  5. pipe <- 1
  6. pipe <- 2
  7. pipe <- 3
  8. fmt.Println(len(pipe))
  9. }
  10. func main() {
  11. test_pipe()
  12. }

代码解释:

pipe := make(chan int, 3)这里是定义一个管道pipe,go是强类型语言,所以这里声明一个管道变量pipe需要通过有3个参数,chan表示管道,int表示管道类型,3表示管道容量;通过len(pipe)可以查看管道的长度,如果想要从管道里面获取数据:

  1. t1 :=<- pipe
  2. // 这个写法等同于
  3. var t1 int
  4. t1 = <- pipe
  5. fmt.PrintIn(t1)

管道遵循的原则是:先进先出,所以第一个获取的值是1。

总结:如果想要给管道放入值,定义的管道pipe < - 要存入的内容;如果想要从管道中获取值,变量名 =< - 定义的管道pipe。

多返回值

一个函数可以返回多个值

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func calc(a int, b int) (int, int) {
  6. sum := a + b
  7. avg := sum / 2
  8. return sum, avg
  9. }
  10. func main() {
  11. sum, avg := calc(100, 200)
  12. fmt.Println(sum, avg)
  13. }

传入多个参数的时候是需要用括号括起来,单个的情况下一般不用括号括起来;这里是返回两个则需要(int, int)表示返回两个整数类型值,如果只需要多个返回值的某个,可以通过下划线方式实现,上述代码改为:

  1. func main(){
  2. sum, _ := calc(100, 200)
  3. fmt.PrintIn(sum)
  4. }

  • 和Python一样,把相同功能的代码放到同一目录,称之为包;
  • 包的主要用途是提高代码的复用性,包可以被其他包引用,同样也可以引用其他包;
  • main包是用来生成可执行文件,每个程序都只有一个main包;

main包中的main函数,go程序经过编译之后运行该程序,会将编译好的二进制文件加载到内存中,会首先调用main函数,所以main函数是程序的入口函数,即必须有package main;

可以理解包就是常用功能的封装,这时包中的每个go文件则不需要package main,而是package自定义名字,该名字是根据这个包的功能进行命名;

go源码按package进行组织,并且package要放到非注释的第一行。一个程序只有一个main包,一个包中只能有一个main函数,不能重复定义;main函数是程序的执行入口,没有被引用的变量,编译时会报错;

go的目录规范

举个简单的例子:当我们创建一个go项目目录时,通常在这个目录下我们会创建如下目录

  • src 存放不同的项目代码;
  • bin 存放编译后的可执行文件;
  • pkg 存放静态库;
  • vender 存放引用的第三方库;

Go代码结构开发规范

好的代码规范非常重要,无论阅读别人的代码还是别人阅读我们的代码都非常清楚明白,如下结构:

  1. // 当前程序的包名
  2. package main
  3. // 导入其他的包
  4. import "fmt"
  5. // 常量的定义
  6. const PI=3.14
  7. // 全局变量的声明和赋值
  8. var name = "gopher"
  9. // 一般类型声明
  10. type newType int
  11. // 结构的声明
  12. type gopher struct{}
  13. // 接口的声明
  14. type golang interface{}
  15. // 由main函数作为程序入口点启动
  16. func main(){
  17. fmt.PrintIn("Hello, World! 你好世界!")
  18. }

Go语言【第一篇】:Go初识的更多相关文章

  1. EnjoyingSoft之Mule ESB开发教程第一篇:初识Mule ESB

    目录 1. Mule ESB基本介绍 2. Mule ESB社区版和企业版 3. Mule ESB常用场景 4. Mule ESB软件安装 客户端安装 服务端安装 5. 第一个Mule ESB应用- ...

  2. 深入研究C语言 第一篇(续)

    没有读过第一篇的读者,可以点击这里,阅读深入研究C语言的第一篇. 问题一:如何打印变量的地址? 我们用取地址符&,可以取到变量的偏移地址,用DS可以取到变量的段地址. 1.全局变量: 我们看到 ...

  3. 回合对战制游戏第一篇(初识java)

    回合对战制游戏第一篇 一,所谓的java. java是一门完全面向对象的编程语言,而之前所接触到的C语言是一门面向有一个过程的语音,对于两个的区别应该有一个清楚的认识. java的第一个内容. 类和对 ...

  4. python开发第一篇:初识python

    一. Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为AB ...

  5. 深入研究C语言 第一篇

    一. 研究过程 1.第一章:创建编译环境: 我们首先下载TC2.0,找到其中与编译连接相关的程序和文件: (1) 编译器:TCC.exe (2) 连接器:tllike.exe (3) 相关文件:c0s ...

  6. MySQL 第一篇:初识数据库

    一 数据库管理软件的由来 基于我们之前所学,数据要想永久保存,都是保存于文件中,毫无疑问,一个文件仅仅只能存在于某一台机器上. 如果我们暂且忽略直接基于文件来存取数据的效率问题,并且假设程序所有的组件 ...

  7. 第一篇:初识python

    1.python介绍 Python, 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年. Python的官方介绍是: ...

  8. python、第一篇:初识数据库

    一 数据库管理软件的由来 基于我们之前所学,数据要想永久保存,都是保存于文件中,毫无疑问,一个文件仅仅只能存在于某一台机器上. 如果我们暂且忽略直接基于文件来存取数据的效率问题,并且假设程序所有的组件 ...

  9. Node.js之路【第一篇】初识Node.js

    什么是Node.js 1.Node.js就是运行在服务端的JavaScrip. 2.Node.js是一个基于Chrome JavaScrip运行时简历的一个平台. 3.Node.js是一个非阻塞I/O ...

  10. 第一篇:初识ASP.NET控件开发_第三节:“生死有序”的控件生命周期

    一.Page本质是一个Control 我们首先要澄清的第一个概念是页面类Page本质是一个控件类,它派生于TemplateControl类,而TemplateControl派生自Control类.既然 ...

随机推荐

  1. 20145209刘一阳《网络对抗》Exp2 后门原理与实践

    20145209刘一阳<网络对抗>Exp2 后门原理与实践 基础问题回答 1.例举你能想到的一个后门进入到你系统中的可能方式? •在网上下载软件的时候,后门很有可能被捆绑在下载的软件当中: ...

  2. CSS布局遇到的问题小结

    clear属性的作用 指定某个元素的一侧不能出现浮动元素.它是通过为这个元素在上边距之外增加空间,从而使得这个元素的顶部和浮动元素的底部对齐.这里作用的仅仅是同一个bfc下的浮动元素. This pr ...

  3. JAVA面试中问及HIBERNATE与 MYBATIS的对比

    第一方面:开发速度的对比 就开发速度而言,Hibernate的真正掌握要比Mybatis来得难些.Mybatis框架相对简单很容易上手,但也相对简陋些.个人觉得要用好Mybatis还是首先要先理解好H ...

  4. P/Invoke 光标的操作

    获取与设置光标在屏幕上的位置 GetCursorPos 获取光标在屏幕上的位置,光标位置始终是在屏幕坐标纵指定的,并且不受包含光标的窗口映射模式的影响 函数原型: BOOL GetCursorPos( ...

  5. Windows运行机理——消息与消息队列

    Windows运行机理这系列文章都是来至于<零基础学Qt4编程>——吴迪,个人觉得写得很好,所以进行了搬运和个人加工 Windows程序设计时一种基于消息的时机驱动方式的设计模式,完全不同 ...

  6. MySQL☞abs函数

    abs( )函数:求出绝对值 格式: select  abs(数值)  from 表名 如下图:

  7. ajax 个人理解 学习笔记

    W:Ajax Q:异步网络请求.无刷新请求数据. W:ajax的实现流程如下: Q: 创建XHR对象 调用open()方法,创建请求 调用send()方法,发送请求 捕获请求状态,判断请求结果 获取数 ...

  8. [Clr via C#读书笔记]Cp7常量和字段

    Cp7常量和字段 常量 常量在编译的时候必须确定,只能一编译器认定的基元类型.被视为静态,不需要static:直接嵌入IL中: 区别ReadOnly 只能在构造的时候初始化,内联初始化. 字段 数据成 ...

  9. 【shell 每日一练6】初始化安装Mysql并修改密码

    一.简单实现mysql一键安装 参考:[第二章]MySQL数据库基于Centos7.3-部署 此脚本前提条件是防火墙,selinux都已经设置完毕: [root@web130 ~]# cat Inst ...

  10. Python高级编程-序列化

    在程序运行的过程中,所有的变量都是在内存中,比如,定义一个dict: dict1 = {'name': 'Rob', 'age': 19, 'score': 90} 可以随时修改变量,比如把age改成 ...