前面已经了 Go 环境的配置和初学Go时,容易遇到的坑。我们知道Go语言和我们以前的Java或是C#哈时候很大差别的。所以在学习Go,首先必须要熟悉Go语言的基础语法。接下来就为初学者大致介绍下Go语言基础语法。
一、Go 程序的基本结构
下面是一个Go 程序的基本结构,包含(包声明,引入包,函数等)
package main // 定义包名,package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。 import "fmt" // 导入需要使用的包(的函数,或其他元素) func main() { // 程序的入口函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数。 fmt.Println("Hello, World!") }
上面的示例,就是最基本的Go 程序,其中:
- package 表示程序所在的包名。
- import 表示导入需要使用的包。
- main 为程序的入口函数。
需要注意的是:同一文件夹下,只能有一个man函数,否则会报错。
二、Go语言的数据类型
Go提供了int、bool等基本数据类型,也有array、slice、map等高级数据类型。下面就来介绍这些数据类型的用法。
1. 基本数据类型
Go提供的布尔(bool)、数值类型(int,float)和字符串类型(string)等基本数据类型。用法与其他语言类似。
- 布尔类型(bool),布尔型的值只可以是常量 true 或者 false。一个简单的例子:var b bool = true。
- 数值类型,又可以分为整数类型、浮点类型、和复数类型。
整数类型包括(byte,rune,int/uint,int8/uint8,int16/uint16,int32/uint32,int64/uint64)
浮点类型包括(float32,float64)
复数类型包括(complex64,complex128)
- 字符串类型,Go的字符串是由单个字节连接起来的。使用UTF-8编码标识Unicode文本。
2. 高级数据类型
Go语言除了提供以上一些基本数据类型,为了方便开发者,也提供了array、slice、map等高级数据类型。
- 数组(array)
- 切片(slice)
- 字典(map)
- 通道(channel)
- 函数(function)
- 结构体(function)
- 接口(interface)
- 指针(*Xxx,Pointer,uintptr)
这些高级数据类型中,array和map与java中的作用比较类似。但是,slice、channel等是Go独有的。后面会详细介绍。
除此之外,如果按照底层结构划分可以分为值类型和引用类型。
- 值类型包括(所有基本数据类型,数组,结构体)。
- 引用类型包括(slice,map,channel,function,interface,指针)。
三、变量&常量
Go 语言的变量名由字母、数字、下划线组成,其中首个字母不能为数字,声明变量的一般形式是使用 var 关键字。例如:var name string
1.声明变量
a.指定变量类型,声明后若不赋值,使用默认值。
var name string name = "李四"
b.根据值自行判定变量类型。
var name = "李四"
上面的示例,Go会根据值判定变量name 的数据类型为string。
c.简短形式,省略var
age := 10
在使用简略形式定义变量时,需要注意以下几点:
- (:=)是使用变量的首选形式
- (:=)只能被用在函数体内,而不可以用于全局变量的声明与赋值。
- (:=)左侧的变量不应该是已经声明过的,否则会导致编译错误。
2.声明常量
Go语言中,常量的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。使用const 关键字定义。例如:
const name string = "abc"
或者还可以简化的方式定义,与变量的声明类似。具体如下:
const name = "abc"
我们知道常量的值是不能被修改的。但是,Go语言提供了iota关键字来定义这种可以被修改的常量。使用方式如下:
const ( a = iota b = "weiz" c = 9 d = iota )
上面的示例中,使用const关键字定义了四个常量。iota在 const关键字中,默认为 0,const 中每新增一行常量声明将使 iota 加1。所以,a的值就为0,d的值为3。我们可以输出a、b、c、d四个常量的值。看看是否如此:
iota 看起来挺饶的,使用时只要注意一下几点,多写多用几次就熟悉了:
- iota表示连续的,无类型的整数常量,
- 以const开始的常量声明语句为单位,
- 从0开始,每赋给一个常量就递增一次
- 一旦跨越以const开始的常量声明语句就归0
四、运算符
Go 语言提供的运算符有:算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、其他运算符。接下来让我们来详细看看各个运算符的介绍。
1. 算术运算符
算术运算符,包括:+,-,*,/,%,++,--
package main import "fmt" func main() { var a int = 20 var b int = 10 var c int c = a + b fmt.Printf("加法运算的值为 %d\n", c ) c = a - b fmt.Printf("减法运算的值为 %d\n", c ) c = a * b fmt.Printf("乘法运算的值为 %d\n", c ) c = a / b fmt.Printf("除法运算的值为 %d\n", c ) c = a % b fmt.Printf("求余运算的值为 %d\n", c ) a++ fmt.Printf("递增运算的值为 %d\n", a ) a=20 a-- fmt.Printf("递减运算的值为 %d\n", a ) }
2. 关系运算符
关系运算符,返回True或False ,a == b ,包括:==,!=,>,<,>=,<=。
package main import "fmt" func main() { var a = 20 var b = 10 fmt.Printf("a == b : %t\n", a == b) fmt.Printf("a != b : %t\n", a != b) fmt.Printf("a > b : %t\n", a > b) fmt.Printf("a < b : %t\n", a < b) a = 5 b = 20 fmt.Printf("a <= b : %t\n", a <= b) fmt.Printf("a >= b : %t\n", a >= b) }
3.逻辑运算符
逻辑运算符,返回True或False ,包括:&&,||,!。
package main import "fmt" func main() { var a bool = true var b bool = false fmt.Printf("a && b 结果: %t\n", a && b) fmt.Printf("a || b 结果: %t\n" ,a || b) fmt.Printf("!b 结果: %t\n" ,!b) }
4.位运算符
逻辑运算符对整数在内存中的二进制位进行操作,包括: &,|,^,<<和>>。
package main import ( "fmt" ) func main() { var a int = 2 /* 2 = 0000 0010 */ var b int = 7 /* 7 = 0000 0111 */ fmt.Printf("a & b 的值为 %d\n", a&b) fmt.Printf("a | b 的值为 %d\n", a|b) fmt.Printf("a ^ b 的值为 %d\n", a^b) fmt.Printf("a << 2 的值为 %d\n", a<<1) fmt.Printf("b >> 2 的值为 %d\n", b>>1) }
5. 地址运算符
地址运算符用于返回变量存储地址和定义支持变量。包括:&和*
- & : 返回变量存储地址 (&originalValue)
- * :指针变量 (*pointerValue)
package main import "fmt" func main() { var a = 4 var ptr *int /* & 和 * 运算符 */ ptr = &a /* 'ptr' 包含了 'a' 变量的地址 */ fmt.Printf("a 的值为 %d\n", a) fmt.Printf("*ptr 为 %d\n", *ptr) }
6. 接收运算符
接收运算符用于接收通道的数据或者给将数据加入通道。例如:(intChan<-1, <-intChan)。这个后面讲到channel的时候会详细介绍。
五、函数
Go语言的核心就是函数,它是基本的代码块,用于实现各种业务逻辑。Go 语言标准库同样也提供了非常多的内置的函数。例如,len() 函数可以接受不同类型参数并返回该类型的长度。
我们知道,Java或是C#通过public、private 控制函数的可见。但是,Go语言没有public等关键字。它是通过首字母大小写的方式区分的。当函数、结构等标识符以一个大写字母开头,如:GetInfo,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(像面向对象语言中的 public);标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 protected )。
1.函数声明
Go 语言函数定义格式如下:
func function_name( [parameter list] ) [return_types] { 函数体 }
函数声明告诉调用者函数的名称,返回类型,和参数。函数定义解析:
- func:Go语言关键字,声明该代码块为函数。
- function_name:函数名称。
- parameter list:参数列表,指定的是参数类型、顺序、及参数个数。参数是可选的。
- return_types:返回类型,函数返回一列值。return_types 是该列值的数据类型。有些功能不需要返回值,这种情况下 return_types 不是必须的。
- 函数体:函数定义的代码集合。
下面是一个具体的函数定义:
func add(a int,b int ) int{ return a+b }
上面的示例是简单的加法运算,传入两个int参数,返回计算的值。Go语言支持如果所有的参数类型一样,可以使用简单写法:func add(a,b int) int{
。这正是Go语言设计者的初衷:最大可能的简化程序,使其更加优雅。
2.函数返回多个值
Go 语言支持函数返回多个值,即一个函数,同时返回多个返回值。这正是Go语言比其他语言优雅、方便的地方之一。
package main import ( "fmt" "strconv" ) func convert(a string, b string) (int, int) { x, _ :=strconv.Atoi(a) y, _ :=strconv.Atoi(b) return x, y } func main() { a, b := convert("5", "2") fmt.Println(a, b) }
上面的示例我们可以看看到。如果函数返回多个值,但是我们不需要该值时,可使用“_”代替。
最后
以上,就把Go语言的基本语法介绍完了。所谓磨刀不误砍柴工,Go语言的语法有些和java类似,但也有很多不一样的地方。希望大家还是能熟悉掌握这些基础知识,这样后面真正学起Go来才会得心应手。