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

简介: 前面已经了 Go 环境的配置和初学Go时,容易遇到的坑。我们知道Go语言和我们以前的Java或是C#哈时候很大差别的。所以在学习Go,首先必须要熟悉Go语言的基础语法。接下来就为初学者大致介绍下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四个常量的值。看看是否如此:

image.png


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来才会得心应手。

相关文章
|
4月前
|
安全 Java 编译器
对比Java学习Go——基础理论篇
本章介绍了Java开发者学习Go语言的必要性。Go语言以简单、高效、并发为核心设计哲学,摒弃了传统的类继承和异常机制,采用组合、接口和多返回值错误处理,提升了代码清晰度与开发效率。Go直接编译为静态二进制文件,启动迅速、部署简便,其基于Goroutine和Channel的并发模型相较Java的线程与锁机制更轻量安全。此外,Go Modules简化了依赖管理,与Java的Maven/Gradle形成鲜明对比,提升了构建与部署效率。
|
3月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
268 1
|
4月前
|
存储 Java Go
对比Java学习Go——函数、集合和OOP
Go语言的函数支持声明与调用,具备多返回值、命名返回值等特性,结合`func`关键字与类型后置语法,使函数定义简洁直观。函数可作为一等公民传递、赋值或作为参数,支持匿名函数与闭包。Go通过组合与接口实现面向对象编程,结构体定义数据,方法定义行为,接口实现多态,体现了Go语言的简洁与高效设计。
|
4月前
|
存储 Java 编译器
对比Java学习Go——程序结构与变量
本节对比了Java与Go语言的基础结构,包括“Hello, World!”程序、代码组织方式、入口函数定义、基本数据类型及变量声明方式。Java强调严格的面向对象结构,所有代码需置于类中,入口方法需严格符合`public static void main(String[] args)`格式;而Go语言结构更简洁,使用包和函数组织代码,入口函数为`func main()`。两种语言在变量声明、常量定义、类型系统等方面也存在显著差异,体现了各自的设计哲学。
|
5月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
453 0
|
5月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
306 0
|
5月前
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
316 0
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
703 4
Golang语言之管道channel快速入门篇
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
298 4
Golang语言文件操作快速入门篇
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
601 3
Golang语言之gRPC程序设计示例

推荐镜像

更多