Go语言学习笔记一(语法篇)

  国庆节七天假期,这段时间刚好项目那边催的不是很紧,基本上每天都是白天重构一下项目代码,晚上自己学习。(大概是因为容总那边的人都去度假了把项目进度放慢了吧。这两天“彩虹”姐姐也来凑热闹,据说还是直接从澳门出发,然后漂洋过海到了咱们大广东,昨天还在顺德发了个大脾气。苦逼的咱们几个还是天天待在工作室发霉,因为害怕被彩虹姐姐带走,所以把工作室的门窗锁得紧紧的,然后把空调开到20多度,穿上外套,哈哈,这才叫个爽啊!)。最近看到了一篇文章名曰《不要在一门技术上吊死》 深有感触,于是就开始着手学习久闻大名但又与Web开发毫无相干的Go语言。至于什么是Go语言,它有哪些特点,度娘一下一大堆,所以,我这里就不做详细的介绍了,直接从语法开始了。因为,我也是0基础开始接触Go语言,所以难免会有很多错误或者不妥的地方,所以,大家发现了的就留个言让我纠正一下啦,毕竟写博客是为了一起学习,共同进步嘛。好吧,废话不多说了,现在直接进入正题吧!

  至于Go的环境是如何搭建起来的呢,这里也不说啦,网上教程也有很多。不过呢,go的编译环境需要FQ下载的,我这里有个安装包放在了百度云盘了go1.5.1.windows-amd64安装包 直接点击下载就行了哈。go的官网golang.com好像也是被封杀了的,不FQ是看不到的,我这里有个中文版的golang学习网址,有需要的可以进去看看中文版golang好吧,下面真正开始走进Go的神奇王国啦!

  首先我们来看看Go语言的变量是如何声明的。学过C或者C++语言的都知道,变量声明是使用“变量类型”+“变量标识符”组成的,比如:int a; 就是在声明一个为整型的变量了。Go语言的变量声明方式与C和C++语言有明显的不同。对于纯粹的变量声明,Go语言引入了关键字var(学过javascript的这时候肯定会很兴奋哦,因为javascript也是酱紫声明的嘛,先别激动,看了后面就会知道了,二者还是有好的的区别呢)。

var v1 int   // 整型
var v2 string // 字符串
var v3 [10]int // 数组
var v4 []int // 数组切片
var v5 struct { // 结构体
    f int
}
var v6 *int // 指针
var v7 map[string]int // map,key为string类型,value为int类型
var v8 func(a int) int // 函数

通过上面的例子,我们可以看到而“变量类型”是放在最后的。这跟我们的javascript是不同的,由于javascript是一们弱语言,不需要说明变量的类型的。综合上面的例子,我们知道了Go的变量声明语法如下:

var “变量名”  “变量类型”

有一点需要提醒的是,我们发现上面例子中,Go语言的每个语句后面都没有分号。Go是没有要求在每个语句结束位置夹分号的。如果你吃饱了撑着,也是可以加的,编译也是可以通过的。这点事跟C或者C++不一样的,C/C++不加分号是不可以通过编译的。

var关键字的另一种用法是可以将若干个需要声明的变量放置在一起,免得程序员需要重复写var关键字,如下所示:

var (
  v1 int
  v2 string
)

这有点儿像javascript里面的"单var模式"声明变量呢!

下面再来看看怎样初始化变量吧!

对于声明变量时需要进行初始化的场景,var关键字可以保留,但不再是必要的元素,如下所示:

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

以 上三种用法的效果是完全一样的。与第一种用法相比,第三种用法需要输入的字符数大大减少,是懒程序员和聪明程序员的最佳选择。这里Go语言也引入了另一个 C和C++中没有的符号(冒号和等号的组合:=),用于明确表达同时进行变量声明和初始化的工作。指定类型已不再是必需的,Go编译器可以从初始化表达式 的右值推导出该变量应该声明为哪种类型,这让Go语言看起来有点像动态类型语言,尽管Go语言实际上是不折不扣的强类型语言(静态类型语言)。当然,出现 在:=左侧的变量不应该是已经被声明过的,否则会导致编译错误,比如下面这个写法:

var i int
i := 2

会导致类似如下的编译错误:

no new variables on left side of :=

我们已经知道了变量的声明和初始化了,下面再来看看常量这个东西吧。javascript是没有常量的,但是C/C++就有,其实,Go的常量定义和C是相像的,都是通过const关键字。请看下面的例子:

const Pi float64 = 3.14159265358979323846
const zero = 0.0 // 无类型浮点常量
const (
  size int64 = 1024
  eof = -1 // 无类型整型常量
)
const u, v float32 = 0, 3 // u = 0.0, v = 3.0,常量的多重赋值
const a, b, c = 3, 4, "foo"
// a = 3, b = 4, c = "foo", 无类型整型和字符串常量

Go的常量定义可以限定常量类型,但不是必需的。如果定义常量时没有指定类型,那么它与字面常量一样,是无类型常量。常量定义的右值也可以是一个在编译期运算的常量表达式,比如

const mask = 1 << 3

由于常量的赋值是一个编译期行为,所以右值不能出现任何需要运行期才能得出结果的表达式,比如试图以如下方式定义常量就会导致编译错误:

const Home = os.GetEnv("HOME")

原因很简单,os.GetEnv()只有在运行期才能知道返回结果,在编译期并不能确定,所以无法作为常量定义的右值。

上面已经介绍了变量和常量的声明了,下面我们来Go的函数声明了

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

func 函数名(参数列表)(返回值列表) {
// 函数体
}
//对应的一个实例如下:
func Compute(value1 int, value2 float64)(result float64, err error) {
// 函数体
}

通过上面例子,我们会发现,Go的函数可以有多个返回值的。这是与C/C++不同之处。以上的示例函数Compute()返回了两个值,一个叫result,另一个是err。并不是所有返回值都必须赋值。在函数返回时没有被明确赋值的返回值都会被设置为默认值,比如result会被设为0.0,err会被设为nil。

为了让别人读懂自己的代码,也为了自己在若干年后看的懂之前写的代码,注释是程序设计必不可少的。Go程序的代码注释与C++保持一致,即同时支持以下两种用法:

/*
块注释
*/
// 行注释
 

接下来,看看Go对花括号(特别是左花括号"{")的位置的一些限制吧。我们在C/C++或者javascript中,左花括号可以写在一行末尾,也可以另起一行写在开头。但是,如果使用Go语言,左花括号"{"另起一行放置,这样做会使Go编译器报告编译错误,这点需要特别注意。比如有如下代码,我们把左花括号写在了另一行的开头,则会报错

//对应的一个实例如下:
func Compute(value1 int, value2 float64)(result float64, err error)
{
// 函数体
}

报错内容如下:

syntax error: unexpected semicolon or newline before {

正确的写法应该把函数的左花括号放在第一行的末尾,如下:

//对应的一个实例如下:
func Compute(value1 int, value2 float64)(result float64, err error) {
// 函数体
}

最后,我们一起看看Go有哪些数据类型吧,这里仅是简单的列出了Go数据类型,具体的使用方法下次再一起讨论。

Go语言内置以下这些基础类型:

? 布尔类型:bool。

? 整型:int8、byte、int16、int、uint、uintptr等。

? 浮点类型:float32、float64。

? 复数类型:complex64、complex128。

? 字符串:string。

? 字符类型:rune。

? 错误类型:error。

此外,Go语言也支持以下这些复合类型:

? 指针(pointer)

? 数组(array)

? 切片(slice)

? 字典(map)

? 通道(chan)

? 结构体(struct)

? 接口(interface)

时间: 2024-10-12 22:04:16

Go语言学习笔记一(语法篇)的相关文章

GO1.6语言学习笔记1-基础篇

一.GO语言优势   可直接编译成机器码,Go编译生成的是一个静态可执行文件,除了glibc外没有其他外部依赖 静态类型语言,但是有动态语言的感觉 语言层面支持并发.Goroutine和channel使得编写高并发的服务端软件变得相当容易,很多情况下完全不需要考虑锁机制以及由此带来的各种问题.单个Go应用也能有效的利用多个CPU核,并行执行的性能好 内置runtime,支持垃圾回收 跨平台编译 内嵌C支持 简单易学,Go关键字是25个,但是表达能力很强大,几乎支持大多数你在其他语言见过的特性:继

Verilog学习笔记基本语法篇(十二)&#183;&#183;&#183;&#183;&#183;&#183;&#183;&#183; 编译预处理

h Verilog HDL语言和C语言一样也提供编译预处理的功能.在Verilog中为了和一般的语句相区别,这些预处理语句以符号"`"开头,注意,这个字符位于主键盘的左上角,其对应的上键盘字符为"~",这个符号并不是单引号"'".这里简单介绍最常用的`define `include `timescale. 1)宏定义`define 用一个指定的标识符(名字)来代表一个字符串,其的一般形式为: `define 标识符(宏名) 字符串(宏内容) 如:

Verilog学习笔记基本语法篇(二)&#183;&#183;&#183;&#183;&#183;&#183;&#183;&#183;&#183;运算符

Verilog HDL的语言的运算符的范围很广,按照其功能大概可以分为以下几类: (1)算术运算符 +,-,*,/,% 优先顺序 !~ *  /   % +    - <<    >> <    <=  >   >= ==  !==  === !=== & ^  ^~ | && || ?: 最高优先级别 ↓ ↓ ↓ ↓ 最低优先级别 (2)赋值运算符 =,<= (3)关系运算符> ,<,>=,<= (4)

GO1.6语言学习笔记3-工具篇(SublimeText 3+GoSublime组合)

选择SublimeText作为开发工具的原因,最最主要的是它够轻巧,搭配GO开发才能有飞一般的感觉.当然作为开发工具之一,Sublime组合工具也提供足够强大的功能. 自动化提示代码 保存的时候自动格式化代码 支持项目管理 支持语法高亮 SublimeText 3+GoSublime组合的组合的安装配置步骤如下 安装配置好GO开发环境 (如GOROOT, GOPATH等环境变量) 到官网下载安装一个SublimeText 3 打开SublimeText 3,安装Package Control.(

21-黑马程序员------OC 语言学习笔记---点语法和作用域

1    合成存取方法为成员变量实现setter和getter方法,虽然并不难,但如果一个类中包含10个甚至更多的成员变量,为每个成员都编写setter.getter方法將是一件令人反胃的事情.OC语言提供了自动合成setter和getter方法,而且如果开发者需要自己控制某个setter和getter方法的实现,开发者依然可以提供setter和getter方法,这个由开发者自定义的setter和getter方法将会覆盖系统自动合成的setter和getter方法.系统自动合成setter和ge

C语言学习笔记——基本语法

一.数据类型 变量 1.命名规则 字母(下划线"_"被看做是字母).数字组成的序列,字母在前 库例程的名字通常以下划线开头,因此变量名不要以下划线开头 区分字母大小写 关键字不做变量名 变量名要能够尽量从字面上表达变量的用途 局部变量一般使用较短的变量名,外部变量使用较长的名字 2.数据类型及长度 1)C语言只提供了下列几种基本数据类型 char 字符型,占用一个字节 int  整形,通常反映了所用机器中整数的最自然长度 float 单精度浮点型 double 双精度浮点型 此外,还可

Verilog学习笔记基本语法篇(六)&#183;&#183;&#183;&#183;&#183;&#183;&#183;&#183; 循环语句

在Verilog中存在着4种类型的循环语句,用来控制执行语句的执行次数. 1)forever语句: 连续执行的语句. 2)repeat语句:  连续执行n次的语句. 3)while语句:    执行语句,直至某个条件不满足. 4)for 语句:      三个部分,尽量少用或者不用for循环. 各语句的格式与注意事项: 1)forever格式: forever   语句: 或:forever   begin 多条语句 end 常用于产生周期性的波形,用来作为仿真测试信号.它与always的不同之

Swift学习笔记(语法篇)-- String与Character类型

一: String概述 不同于Objective-C中的NSString与NSMutableString,在Swift中,存储String类型的数据能否改变,取决于定义数据是var还是let,var是变量,能改变String的长度,增加,修改,删除其中的每一个字符等操作,而let是常量,一旦定义后就不能再修改其内容. Swift的String类型是值类型,如果你创建了一个新的String类型的数据,当它被赋值传递时会进行值拷贝,产生一个副本. 二:Character概述 String其实是作为一

Verilog学习笔记基本语法篇(八)&#183;&#183;&#183;&#183;&#183;&#183;&#183;&#183; 结构说明语句

Verilog中的任何过程都可以属于以下四种结构的说明语句; 1) initial;  2) always;  3) task;   4) function; 1) initial说明语句: 一个程序中的 initial 和 always 的次数是不受限制的,他们都是在仿真的一开始同时开始运行的.initial 只执行一次,而 always语句则是不断地重复活动,直到仿真活动结束.但是always 后面的过程快是否运行,则要看他的触发条件是否满足,满足则运行一次,再满足再运行,直至仿真结束. 格

Verilog学习笔记基本语法篇(七)&#183;&#183;&#183;&#183;&#183;&#183;&#183;&#183; 生成块

生成块可以动态的生成Verilog代码.可以用于对矢量中的多个位进行重复操作.多个模块的实例引用的重复操作.根据参数确定程序中是否包含某段代码.生成语句可以控制变量的声明.任务和函数的调用.还能对实例引用进行全面的控制.在编程时,应用关键字generate_endgenerate来说明生成的实例范围. 生成实例可以是一下的以下一种或多种类型: 1)模块 :  2)用户定语原语 : 3)门级原语 :  4)连续赋值语句:   5)initial 和 always 块. 生成实例中语序的数据类型: