Go 语言基础之基本语法(1)

简介: Go 语言基础之基本语法

前言

       最近心情格外不舒畅,不仅仅是对前途的迷茫,这种迷茫倒是我自己的问题还好,关键它是我们这种普通吗喽抗衡不了的。

       那就换个脑子,学点新东西吧,比如 Go?

1、Go 语言入门

       介绍就没必要多说了,Go 语言的作者是 B语言、C语言 和 Unix 支付联合开发的,所以可以预见这门语言不会差!而且事实也确实是这样。不得不感慨外国那群搞技术的人是真牛啊。

1.1、Go 环境安装

Go 语言官网 Go下载 - Go语言中文网 - Golang中文社区 下载安装包

安装后使用 go version 进行安装的验证

创建 Go 的工作目录并设置为系统环境变量 GOPATH,创建下面三个目录:

用户变量 GOPATH  默认会有一个工作目录,所以需要覆盖掉:

检查安装成功:

1.2、Hello World

Go 语言的执行必须在 main 包下 :

package main
 
import "fmt"
 
func main() {
  fmt.Print("Hello World")
}

注意:这个包可以是不存在的,也就是它可以不是一个目录!

运行结果:

注意:必须在 GOROOT 环境下去执行

当然,我们也可以去 go 文件所在的文件夹去打开,然后通过 go run 来执行该文件:

注意:必须要把要执行的 go 文放在 main 包下!

如果在运行过程中,出现了下面的报错:

需要关闭 go 环境变量中的 GO111MODULE :

  • GO111MODULE 是一个环境变量,它用于控制Go语言的包管理方式。

在Go 1.11版本之前,Go语言使用 GOPATH 模式来管理项目和依赖包,所有的代码和依赖都需要存放在$GOPATH目录下。随着Go 1.11版本的发布,引入了一种新的包管理方式,即模块(module)系统,这个系统允许开发者在不依赖于GOPATH的情况下管理和构建项目。

具体来说,GO111MODULE 环境变量可以设置以下三个值:

  • on:开启模块支持,此时Go命令行会完全使用模块机制来管理依赖,而不会去GOPATH目录下查找。
  • off:关闭模块支持,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。
  • auto(默认值):自动模式,go命令行将会根据当前目录来决定是否启用module功能。如果当前目录在GOPATH/src之外且该目录包含go.mod文件,或者当前文件在包含go.mod文件的目录下面,则会开启模块支持。

1.3、注释

Go 语言的注释和 Java 几乎一样

1.4、变量

Go 语言是一种静态类型编译型语言。

  • Go语言使用静态类型系统,这意味着变量的类型在编译时就已确定,有助于在编译阶段捕获错误,提高代码的安全性。
  • 同时,Go语言是编译型语言,源代码在执行前需要被编译成机器码。

1.4.1、变量的定义

var name type

同时定义多个变量

var (
    name string    // 默认为空
    age int    // 默认为 0
  )

注意:可以不给变量赋初始值,它会有默认值。

  • 此外,布尔值默认为 false,切片、函数、指针变量的默认值为 nil。

1.4.2、变量的标准初始化

// 使用 var 可以省去类型
var addr = "beijing"
 
// 初始化多个变量
var (
    name string = "zs"
    age int = 18
  )
// 初始化单个变量
var addr string = "beijing"

1.4.3、端变量的初始化(自动推导)

省去 var,可以使用 := 来进行变量类型的自动推导

    name := "zs"
  age := 18
  
  fmt.Println(name,age)
    // %T 代表变量的类型
  fmt.Printf("%T,%T",name, age)

运行结果:

注意:被 := 初始化过的变量不能再初始化了!

1.4.4、打印内存地址

可以使用 Pringf 的 %p 结合 &变量 来实现内存地址的打印(& 也叫取地址符),但是这种取地址的方法只适合与数值类型,因为数值类型存储的是数值,需要用取地址符来取得数值地址,而引用类型本身就是存储的就是地址,不需要再取:

    name := "zs"
 
  fmt.Println(name)
 
  fmt.Printf("name=%s,内存地址=%p\n",name,&name)
 
  name = "ls"
 
  fmt.Printf("name=%s,内存地址=%p",name,&name)

运行结果:

可以看到,即使一个变量的值发生了变化,但是它的内存地址是不会变化的。

1.4.5、变量交换

在别的语言中,变量的交换通常需要借助一个中间变量来实现:

    var tmp int
  tmp = a
  a = b
  b = tmp

但是 Go 语言提供了一个特别简洁的语法:

    var a,b int = 100,200
  println("a =",a,"b =",b)
  
  a,b = b,a
  println("a =",a,"b =",b)

注意这里使用了 println 输出的,看起来简单了很多,但是它是标准错误输出!

1.4.6、匿名变量

       匿名变量就是一个下划线,它可以用于变量的声明或赋值,但是任何赋给这个标识符的值都将被抛弃

       所以这个匿名变量一般用于我们不需要这个值的时候(一般是返回值)。

package main
 
func test()(int,int)  {
  return 100,200
}
 
func main() {
  a,_ := test()
  println(a)
}

       这里,我们不需要第二个返回值,但是接受返回值的时候又不能不写,所以直接使用匿名变量抛弃掉。

       匿名变量不占用内存,不会分配内存。匿名变量和匿名之间也不会因为多次初始化而无法使用。

1.4.7、变量的作用域

       Go 语言中同样是分类局部变量和全局变量,在 Go 语言中,如果全局变量名和局部变量名相同,调用时会使用就近原则:

// 全局变量
var name string = "hive"
func main() {
  // 局部变量
  name := "s"
  println(name)
}

       这里我们的局部变量 name 并不是在重新初始化(在 Go 语言中一个变量只能被初始化一次,除了匿名变量),而是一个全新的变量。

1.5、常量

1.5.1、普通常量

       常量就是在程序运行时,不能被修改的值。在 Go 语言中,常量只能是布尔型、数值型和字符串类型。

    const URL string = "www.csdn.com" // 显示定义 
  const USERNAME = "lyh" // 隐式定义
  
  const a,b,c = 1,2,3 // 同时定义多个常量 

注意:在 Go 语言中,常量全局变量不使用不会报错,但是变量定义了必须使用。

1.5.2、iota

       iota 是一个特殊的常量,可以认为是一个可以被编译器修改的常量。iota 是 go 语言的常量计数器。

       iota 在 const 关键字处显示会被重置为 0 ,const 中每新增一行就会 +1 。

package main
 
import "fmt"
 
func main() {
  const (
    a = iota  // 0
    b = iota  // 1
    c = iota  // 2
  )
  fmt.Println(a,b,c)
  const (
    d = iota  // 0
    e     // 1
    f     // 2
    g = "hello" // iota依然会自增
    h     // 默认和上面的值是一样的 hello
    i = iota  // 5
  )
  fmt.Println(d,e,f,g,h,i)
}

运行结果:


Go 语言基础之基本语法(2)https://developer.aliyun.com/article/1534246

相关文章
|
5天前
|
Go
Go 语言循环语句
在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。
13 1
|
5天前
|
Go 开发者
探索Go语言的并发之美
在Go语言的世界里,"并发"不仅仅是一个特性,它是一种哲学。本文将带你领略Go语言中goroutine和channel的魔力,揭示如何通过Go的并发机制来构建高效、可靠的系统。我们将通过一个简单的示例,展示如何利用Go的并发特性来解决实际问题,让你的程序像Go一样,轻盈而强大。
|
6天前
|
JSON Go API
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
|
5天前
|
Go
go语言创建字典
go语言创建字典
|
6天前
|
NoSQL Go API
go语言操作Redis
go语言操作Redis
|
6天前
|
Unix Go
go语言获取当前时间戳
go语言获取当前时间戳
|
6天前
|
Go
go语言李mapstructure啥意思
go语言李mapstructure啥意思
|
4天前
|
Java 编译器 Go
Go to Learn Go之基础语法
Go to Learn Go之基础语法
|
5天前
|
Go
Go 语言接口
Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。 接口可以让我们将不同的类型绑定到一组公共的方法上,从而实现多态和灵活的设计。
|
6天前
|
存储 Go
go语言字符串变小写
go语言字符串变小写