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

相关文章
|
13天前
|
存储 Go 索引
go语言中数组和切片
go语言中数组和切片
25 7
|
12天前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
13天前
|
程序员 Go
go语言中结构体(Struct)
go语言中结构体(Struct)
88 71
|
12天前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
97 67
|
13天前
|
存储 Go
go语言中映射
go语言中映射
30 11
|
15天前
|
Go
go语言for遍历映射(map)
go语言for遍历映射(map)
28 12
|
14天前
|
Go 索引
go语言使用索引遍历
go语言使用索引遍历
24 9
|
14天前
|
Go 索引
go语言使用range关键字
go语言使用range关键字
23 7
|
14天前
|
Go 索引
go语言修改元素
go语言修改元素
23 6
|
4天前
|
Go 数据安全/隐私保护 UED
优化Go语言中的网络连接:设置代理超时参数
优化Go语言中的网络连接:设置代理超时参数