Golang 语言的编程技巧之变量

简介: Golang 语言的编程技巧之变量

介绍

在 Golang 语言中,有多种声明变量的方式,但是每种方式都有它特殊的功能,本文我们介绍一些关于变量的编程技巧。

编程技巧

类型推断

类型推断就是在声明一个变量时,不指定变量的数据类型,变量的数据类型由右值推断得到。

Golang 语言是一门静态类型的编程语言,我们声明变量或常量时,需要指定变量或常量的数据类型,我们可以显示指定变量的数据类型,也可以使用 Golang 语言的类型推断。

func main () {
    var name string
    name = "frank"
    fmt.Printf("val:%s type:%T\n", name, name)
}

阅读上面的代码,我们声明变量 name 的数据类型是 string,看上去也没什么问题,那么,我们再来看一段代码。

func main () {
    var name string
    name = getVal()
    fmt.Printf("val:%s type:%T\n", name, name)
}
func getVal () string {
  return "frank"
}

阅读上面这段代码,我们将变量 name 的赋值改为使用函数表达式赋值。目前 getVal() 函数的返回结果的数据类型是 string,如果未来我们需要修改 getVal() 函数的返回结果的数据类型为 int,我们 main 函数中的变量 name 也需要进行对应的修改,这样使得我们的应用程序不灵活,增加了我们维护(重构)代码的难度。

如果我们在声明变量 name 时,不使用指定数据类型的方式,而是通过简短声明的方式(也可以使用 var 变量名 = 表达式 的语法)使用 Golang 语言的类型推断功能,上述的问题就解决了。如果你使用过动态类型(弱类型)的编程语言,比如 Python 或 PHP,是不是感觉这种方式,可能会有所感触。

func main () {
    // var name = getVal()
    name := getVal()
    fmt.Printf("val:%s type:%T\n", name, name)
}
// func getVal () string {
//     return "frank"
// }
func gateVal () int {
    return 1
}

重新声明变量

所谓重新声明变量,就是将已经存在的变量重新定义,使用简短声明变量的方式,将同一代码块中的变量重新声明。

重新声明变量有一些前提条件:

  • 重新声明变量,必须使用简短声明方式。
  • 重新声明变量,不能修改原变量的数据类型。
  • 重新声明变量,左边的变量至少包含一个未声明过的变量。
  • 重新声明变量,只作用于同一代码块中的变量。

我们了解了重新声明变量,不知道有没有体会到它的好处,在我看来,重新声明变量的好处就是可以减少代码量。

未使用重新声明变量:

func main () {
    var name string
    name = "lucy"
    var age uint
    age = 18
    name = "frank"
    fmt.Printf("name:%s age:%d\n", name, age)
}

使用重新声明变量:

func main () {
    var name string
    name = "lucy"
    name, age := "frank", 18
    fmt.Printf("name:%s age:%d\n", name, age)
}

阅读上面这两段代码,我们发现使用简短声明的方式重新声明变量 name,无需关心被赋值的变量中是否已存在,而且可以减少代码量,并且必须使用简短声明的方式,因为如果使用 var 关键字声明已存在的变量会引发编译错误。

同名变量

所谓同名变量,是指在不同代码块,相同变量名的变量,因为在同一代码块,变量名相同会引发编译错误。

package main
import (
    "fmt"
)
var a = 1
func main () {
    a := "golang"
    fmt.Printf("val:%s type:%T\n", a, a)
}

阅读上面这段代码,我们分别在 main 包代码块和 main 函数代码块声明了变量 a,通过打印结果可以看出打印的是 main 函数中的变量 a。该示例代码说明位于不同代码块的同名变量,因为其作用域也不同,所以不会引发编译错误。

03

总结

本文我们介绍了关于变量的一些编程技巧,包括类型推断,重新声明变量和同名变量。如果用好这些关于变量的编程技巧,可以有效提升代码的可维护性和健壮性。

推荐阅读:

Golang 语言中的非类型安全指针

Go 语言学习之变量

参考资料:

https://tour.go-zh.org/basics/14 

https://docs.hacknode.org/gopl-zh/ch2/ch2-03.html 

https://docs.hacknode.org/gopl-zh/ch2/ch2-07.html 


目录
相关文章
|
2月前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
114 4
Golang语言之管道channel快速入门篇
|
2月前
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
67 4
Golang语言文件操作快速入门篇
|
2月前
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
104 3
Golang语言之gRPC程序设计示例
|
2月前
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
86 4
|
2月前
|
Go 调度
Golang语言goroutine协程篇
这篇文章是关于Go语言goroutine协程的详细教程,涵盖了并发编程的常见术语、goroutine的创建和调度、使用sync.WaitGroup控制协程退出以及如何通过GOMAXPROCS设置程序并发时占用的CPU逻辑核心数。
52 4
Golang语言goroutine协程篇
|
2月前
|
Prometheus Cloud Native Go
Golang语言之Prometheus的日志模块使用案例
这篇文章是关于如何在Golang语言项目中使用Prometheus的日志模块的案例,包括源代码编写、编译和测试步骤。
55 3
Golang语言之Prometheus的日志模块使用案例
|
1月前
|
前端开发 中间件 Go
实践Golang语言N层应用架构
【10月更文挑战第2天】本文介绍了如何在Go语言中使用Gin框架实现N层体系结构,借鉴了J2EE平台的多层分布式应用程序模型。文章首先概述了N层体系结构的基本概念,接着详细列出了Go语言中对应的构件名称,包括前端框架(如Vue.js、React)、Gin的处理函数和中间件、依赖注入和配置管理、会话管理和ORM库(如gorm或ent)。最后,提供了具体的代码示例,展示了如何实现HTTP请求处理、会话管理和数据库操作。
31 0
|
2月前
|
Go
Golang语言错误处理机制
这篇文章是关于Golang语言错误处理机制的教程,介绍了使用defer结合recover捕获错误、基于errors.New自定义错误以及使用panic抛出自定义错误的方法。
48 3
|
2月前
|
Go
Golang语言之函数(func)进阶篇
这篇文章是关于Golang语言中函数高级用法的教程,涵盖了初始化函数、匿名函数、闭包函数、高阶函数、defer关键字以及系统函数的使用和案例。
64 3
Golang语言之函数(func)进阶篇
|
2月前
|
Go
Golang语言之函数(func)基础篇
这篇文章深入讲解了Golang语言中函数的定义和使用,包括函数的引入原因、使用细节、定义语法,并通过多个案例展示了如何定义不返回任何参数、返回一个或多个参数、返回值命名、可变参数的函数,同时探讨了函数默认值传递、指针传递、函数作为变量和参数、自定义数据类型以及返回值为切片类型的函数。
63 2
Golang语言之函数(func)基础篇
下一篇
无影云桌面