GO程序设计1——快速入门

摘要:
使用GO语言,据说:1packagemain23import67funcmin(){8fmt.Println(“HelloWorld!Funcmain()main function main(),此函数是执行程序的起点,不能接受参数或定义返回值。import导入包以导入程序所需的其他包。一般函数定义如下:1func function name{2/function body 3}您可以看到Go语言和其他语言在定义函数方面的区别。它还列出了返回值列表。
1.GO语言开发环境搭建                                             

1.1编译环境安装

点击链接http://code.google.com/p/go/downloads/list

选择一个版本,本人下载的是go1.0.3.windows-386.msi

双击安装,选择安装一个安装主目录:例如,C:\Go,不需要配置什么东西。

 GO程序设计1——快速入门第1张

1.2集成开发环境IDE安装配置

打开链接:http://code.google.com/p/golangide/downloads/list

下载一个版本:如liteidex17.windows.7z

下载完毕后在某个目录下解压即可

GO程序设计1——快速入门第2张

 

点击liteide.exe,打开开发界面。

配置环境变量                 

菜单:查看→选项,选择LiteEnv,配置环境变量,有三个文件,system.env,win32.env,win32-user-env需要配置,配置很简单,只需要修改上一步安装的编译环境目录即可,三个文件都一样。

  GOROOT=C:\Go
  GOBIN=C:\Go\bin
  取消掉PAHT前的#号,其他的不用修改
选择查看→设置GOPATH,刷新就可以看到system 的GOPATH,浏览自定义的GOPATH,设置存放代码的空间目录,开发环境就搭建好了

2.HelloWorld!                                                 

  语言"出生"后"说"的的第一句话都是,Hello World!

  使用GO语言,是这样说的:

1 package main
2 
3 import (
4     "fmt"
5 )
6 
7 func main() {
8     fmt.Println("Hello World!")
9 }

  编译后运行即可出现:Hello World!

3.初见GO语言                                                               

  GO语言Google开发的新语言。有如下特性
  自动垃圾回收、更丰富的内置数据类型、函数多返回值、错误处理、匿名函数和闭包、类型和接口、并发编程、反射、多语言混合编程

1 package main   
2 
3 // 我们需要使用fmt包中的Println()函数 
4 import "fmt"
5  
6 func main() {      
7     fmt.Println("Hello, world!")  
8 } 

3.1代码解析                        

package main

  每个GO源代码文件的开头声明该Go代码所属的包,包是Go语言里最基本的分发单位,要生成可执行程序,必须建立一个名字为main的包,并且在该包中包含一个叫main()的函数(该函数是Go可执行程序的执行起点)。
func main()

  主函数main(),该函数是执行程序的起点,不能带参数,也不能定义返回值。命令传入的参数在os.Args变量中保存。如果需要支持命令行开关,使用flag包。

import 导包

  导入该程序所需要的其他包。由于用到了系统函数Println(),所以导入该函数所属的fmt包。

注意

  不能把源代码文件中没有用到的包导进去,否则Go编译器会报编译错误

func关键字
  所有的Go函数(包括在对象编程中会提到的类型成员函数)以关键字func开头。一个常规的函数定义如下:

1 func 函数名(参数列表)(返回值列表){
2  //函数体
3 }

  可以看出Go语言与其他语言定义函数的区别,它把返回值列表也列在里面。
对应示例:

1 func Compute(value1 int,value2 float64)(result float64,err error){
2  //函数体
3 }

  Go支持多个返回值。上面的函数Compute()返回了两个值,一个叫result,一个是err,并不是所有返回值都必须赋值,如果没有明确赋值的返回值被设置为默认值,会根据基本数据类型对返回值初始化,float64为0.0, error为nil,也就是result是0.0 err为nil
注释:
Go程序的代码注释有两种:块注释和行注释
  /*
  块注释
  */
  //行注释

语句结束符号

  关于语句结束符号:Go程序不要求开发者在每个语句后面加上分号表示语句结束,当然加上也可以,但Google提供的IDE开发工具在加上分号;后编译时会自动消掉分号
大括号位置
   在Java程序设计里面有提到过大括号怎么放。Go语言中,在函数的返回值后面紧着函数体的左大括号,不能另起一行,这一点与Java通常用法是一致的,也有人把同一个级别的函数体左括号单独起一行,与右括号放在一列,这样在Go语言中是不行的。

1 func 函数名(参数列表)(返回值列表)
2 {
3  //函数体
4 }

  其实可以发现左括号放在返回值列表后面是有一个好的地方是:在很多编辑器里面,比如notepad,它把左括号和右括号之间用线连起来,显得是一个整体,如果把左括号单独起一行,会显得函数定义时候func行不与函数体一起,而把左大括号放在func行,会显得整个函数浑然一体。

3.2若干命令                        

查看go版本
  cmd —— go version输出 go version go1.0.3
编译源程序
   go build HelloWorld.go
运行编译后代码
   HelloWorld.exe

函数的单元测试
xxx.go对应的单元测试是xxx_test.go,这是go工程里的命名规则

2. 顺序编程                                                                  

2.1 变量                              

  从根本上说,变量是对一块数据存储空间的命名,程序可以通过定义一个变量来申请一块数据存储空间,之后通过调用(引用)变量名来使用这块存储空间

2.1.1 变量定义               

  Go语言的变量声明方式与其他语言相差比较大。引入了一个关键字var(但不是必须的),表示一个变量

定义语法

  var 变量名 变量类型
示例:var name string

  这种方式其实更符合英语习惯 可以把上面的定义方式扩展成英语:the variable name is a string 变量name是一个string,如果去掉动词、量词就可以看出var name string 比较近似我们平时使用的英语语法结构。

类似地:

 1 var v1 int
 2 var v2 string
 3 var v3 [10]int   //定义一个固定长度的数组
 4 var v4 []int   //定义一个可变长度的数组
 5 var v5 struct{
 6  f int
 7 }
 8 var v6 *int    //指针
 9 var v7 map[string]int //字典,或者说关联数组与Java的map类似,key为string类型,value为int类型
10 var v8 func(a int) int

变量块

可以使用var关键字声明若干个关键字,形成一个变量块

1 var(
2  v1 int
3  v2 string
4 )

   从上面多出的var关键字可以看出,有一个var关键字更加符合英语习惯,不仅如此,可以同时声明多个变量,把变量用一个关键字var包起来,形成一个整块,这样可读性更好,不会让变量乱放。

2.1.2变量赋值                         

1  //定义一个变量
2  var v1 int
3  //对一个变量初始化赋值
4  v1 = 10

  上面的两步可以合成,也就是定义加初始化用一个语句完成。 

 有三种方式
 

1 var v1 int = 10 //正确使用方式1
2 var v2 = 10     //正确使用方式2,编译器可以自动推导出v2的类型
3 v3 := 10     //正确使用方式3,编译器可以自动推导v3的类型

   :=这个运算符包含了定义和初始化两步操作。出现这个运算符的变量不应该是已经被定义过的,否则会编译错误。
   指定变量类型不是必须的,看起来有点像动态类型语言。但实际是静态语言。
   Go语言提供了多重赋值功能,例如进行i,j的值交换,这样可以避免很多无关的变量都定义了,影响代码可读性
   i,j = j,i

2.1.3匿名变量             

  我们在使用传统的强类型语言编程时,经常会出现这种情况,即在调用函数时为了获取一个值,却因为该函数返回多个值而不得不定义一堆没用的变量。在Go中这种情况可以通过结合使
用多重返回和匿名变量来避免这种丑陋的写法,让代码看起来更加优雅。 

 2.2 常量

   常量是指编译期间已知且不可改变的值,常量可以是数值类型(包括整型、浮点型和复数类型)、布尔类型、字符串类型

2.2.1 字面常量                     

  字面常量是指程序中硬编码的常量,如
无类型 2   //由于2在许多数值类型定义域内,并且没有规定2的类型,因此是一个无类型,当然也可以指定2L,是一个long型的
浮点型 3.1415926
复数型 3.2+12i
布尔型 true
字符串 "true"

2.2.2常量定义                     

  通过const关键字,可以指定字面常量名字

1 const Pi float64 = 3.1432423424234
2 const zero = 0.0
3 const(
4  size int64 = 1024
5  eof = -1//无类型整型常量
6 )
7 const u,v float32 = 0.3 //定义多重赋值
8 const a,b,c = 3,4,"true" //a = 3,b = 4,c = "true",无类型整型和字符串常量

  常量定义的右值也可以是一个编译期运算的常量表达式
  const mask = 1 <<3
  常量的赋值是一个编译期行为,所以右值不能出现任何需要运行期才能得出结果的表达式(否则就不是常量了)
下面的例子就会导致编译错误,常量就是运行前就已经确定的值。
const Home = os.GetEnv("HOME") 


 2.2.3 预定义常量    

  Go语言预定义了这些常量true、false和iota.iota比较特殊,可以被认为是一个可被编译器修改的常量,在每一个const关键字出现时被重置为0,然后在下一个const出现之前,每出现一次iota,其所代表的数字会自动增1。
  从以下的例子可以基本理解iota的用法: 

 1 const (            // iota被重设为0 
 2     c0 = iota   // c0 == 0 
 3     c1 = iota     // c1 == 1 
 4     c2 = iota     // c2 == 2  
 5 )   
 6  
 7 const ( 
 8     a = 1 << iota   // a == 1 (iota在每个const开头被重设为0) 
 9     b = 1 << iota    // b == 2 
10     c = 1 << iota    // c == 4  
11 )   
12  
13 const ( 
14     u         = iota * 42   // u == 0 
15     v float64 = iota * 42   // v == 42.0 
16  w         = iota * 42  // w == 84  
17 )   
18 const x = iota     // x == 0 (因为iota又被重设为0了)  
19 const y = iota     // y == 0 (同上) 

如果两个const的赋值语句的表达式是一样的,那么可以省略后一个赋值表达式。因此,上面的前两个const语句可简写为: 

 1 const (       // iota被重设为0 
 2     c0 = iota      // c0 == 0 
 3     c1      // c1 == 1 
 4     c2       // c2 == 2 
 5 ) 
 6  
 7 const ( 
 8     a = 1 <<iota     // a == 1 (iota在每个const开头被重设为0) 
 9     b      // b == 2 
10     c      // c == 4 
11 ) 

  个人认为iota未必是一个好的数据类型 

2.2.4枚举              

  枚举指一系列相关的常量,比如下面关于一个星期中每天的定义。通过上一节的例子,我们看到可以用在const后跟一对圆括号的方式定义一组常量,这种定义法在Go语言中通常用于定义
枚举值。Go语言并不支持众多其他语言明确支持的enum关键字。
  下面是一个常规的枚举表示法,其中定义了一系列整型常量:

 1 const ( 
 2     Sunday = iota 
 3     Monday 
 4     Tuesday 
 5     Wednesday 
 6     Thursday 
 7     Friday 
 8     Saturday 
 9     numberOfDays        // 这个常量没有导出  
10 )  

  同Go语言的其他符号(symbol)一样,以大写字母开头的常量在包外可见。 以上例子中numberOfDays为包内私有,其他符号则可被其他包访问。

2.3 数据类型                      

Go支持如下数据类型

 

 

免责声明:文章转载自《GO程序设计1——快速入门》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇十七、java内存模型_JVM_JDK_类加载器及过程Android 热修复 Tinker接入及源码浅析下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

javscript---Bom 和Dom

JavaScript分为 ECMAScript,DOM,BOM。 ECMA javascript标准语法  BOM(Browser Object Model)是指浏览器对象模型,它使 JavaScript 有能力与浏览器进行“对话”。 DOM (Document Object Model)是指文档对象模型,通过它,可以访问HTML文档的所有元素。 Wind...

开发规约(一)接口统一返回值格式

一、前言 上篇在介绍 Spring Boot 集成 Dubbo 时,埋下了有关返回值格式的一个小小伏笔。本篇将主要介绍一种常用的返回值格式以及通过什么手段去达成这个目的。 二、Dubbo 接口统一返回值格式 我们在应用中经常会涉及到 server 和 client 的交互,目前比较流行的是基于 json 格式的数据交互。但是 json 只是消息的格式,其...

Oracle之PL/SQL编程

PL/SQL(ProceduralLanguage/SQL,过程语言/SQL) 是结合了Oracel过程语言和结构化查询语言(SQL)的一种扩展语言。 优点: (1)PL/SQL具有编程语言的特点,它能把一组SQL语句放到一个模块中,使其更具模块化种序的特点。 (2)PL/SQL可以采用过程性语言控制程序的结构。 (3)PL/SQL有自动处理的异常处理机制...

Linux内核死机调试方法总结

使用空指针和缓冲区溢出是产生oops的两个最常见原因。 1、直接查看oops信息,首先查找源代码发生oops的位置,通过查看指令寄存器EIP的值,可以找到位置。再查找函数调用栈可以得到更多的信息。从函数调用栈可辨别出局部变量,全局变量和函数参数。较为重要的信息就是指令指针(EIP),即出错指令的地址。 例如:在函数faulty_read的oops信息的函数...

Bat脚本之延时变量cmd /v:on

延时环境变量作用即工作原理: ​ 当准备执行一条命令时,命令解释器会检查语句中是否有环境变量,如果有就会先将变量的值读取出来赋给变量,就像初始化,会将已知变量先赋值。这会导致语句中多次使用的某个环境变量的值都是一样的都是一个定值。 ​ 延时环境变量,开启方式如下,使用!xx!包裹,不是%xx%,会在变量使用的时候才进行读值赋值,不会在一开始就赋值。 举个例...

关于php性能优化

php性能优化 1.尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍。 当然了,这个测试方法需要在十万级以上次执行,效果才明显。 其实静态方法和非静态方法的效率主要区别在内存:静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,所以静态方法可以直接调用,实例方法要先成生实例,通过实例调用...