一起学Golang系列(四)学习Go语言语法,这篇文章就够了!

前面已经了 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四个常量的值。看看是否如此:

一起学Golang系列(四)学习Go语言语法,这篇文章就够了!


iota 看起来挺饶的,使用时只要注意一下几点,多写多用几次就熟悉了:

  1. iota表示连续的,无类型的整数常量,
  2. 以const开始的常量声明语句为单位,
  3. 从0开始,每赋给一个常量就递增一次
  4. 一旦跨越以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来才会得心应手。

上一篇:一起学Golang系列(二)Golang开发环境搭建


下一篇:实战:使用Spring Boot Admin实现运维监控平台