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

相关文章
|
1天前
|
安全 Go 数据处理
探索Go语言的并发之美:Goroutines与Channels
在Go语言的世界里,"并发"不仅仅是一个概念,它是一种生活的方式。本文将带你领略Go语言中Goroutines和Channels的魔力,它们是如何让并发编程变得既简单又高效。我们将通过一个简单的示例,展示如何使用这些工具来构建一个高性能的网络服务。
|
1天前
|
关系型数据库 Go 数据处理
高效数据迁移:使用Go语言优化ETL流程
在本文中,我们将探索Go语言在处理大规模数据迁移任务中的独特优势,以及如何通过Go语言的并发特性来优化数据提取、转换和加载(ETL)流程。不同于其他摘要,本文不仅展示了Go语言在ETL过程中的应用,还提供了实用的代码示例和性能对比分析。
|
1天前
|
Go 定位技术 索引
Go 语言Map(集合) | 19
Go 语言Map(集合) | 19
|
1天前
|
Go
go语言注释,标识符 | 17
go语言注释,标识符 | 17
Go语言的条件控制语句及循环语句的学习笔记
本文是Go语言的条件控制语句和循环语句的学习笔记,涵盖了if语句、if-else语句、if嵌套语句、switch语句、select语句以及for循环和相关循环控制语句的使用方法。
Go语言的条件控制语句及循环语句的学习笔记
|
20小时前
|
存储 Go
go语言字符串变小写
go语言字符串变小写
|
20小时前
|
NoSQL Go API
go语言操作Redis
go语言操作Redis
|
20小时前
|
Unix Go
go语言获取当前时间戳
go语言获取当前时间戳
|
20小时前
|
Go
go语言李mapstructure啥意思
go语言李mapstructure啥意思
|
22小时前
|
Go
8-12|go语言之输入
8-12|go语言之输入