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 


目录
相关文章
|
4天前
|
Go 开发者
Golang深入浅出之-Go语言上下文(context)包:处理取消与超时
【4月更文挑战第23天】Go语言的`context`包提供`Context`接口用于处理任务取消、超时和截止日期。通过传递`Context`对象,开发者能轻松实现复杂控制流。本文解析`context`包特性,讨论常见问题和解决方案,并给出代码示例。关键点包括:1) 确保将`Context`传递给所有相关任务;2) 根据需求选择适当的`Context`创建函数;3) 定期检查`Done()`通道以响应取消请求。正确使用`context`包能提升Go程序的控制流管理效率。
13 1
|
4天前
|
安全 Go 开发者
Golang深入浅出之-Go语言并发编程面试:Goroutine简介与创建
【4月更文挑战第22天】Go语言的Goroutine是其并发模型的核心,是一种轻量级线程,能低成本创建和销毁,支持并发和并行执行。创建Goroutine使用`go`关键字,如`go sayHello("Alice")`。常见问题包括忘记使用`go`关键字、不正确处理通道同步和关闭、以及Goroutine泄漏。解决方法包括确保使用`go`启动函数、在发送完数据后关闭通道、设置Goroutine退出条件。理解并掌握这些能帮助开发者编写高效、安全的并发程序。
13 1
|
4天前
|
SQL 关系型数据库 MySQL
Golang数据库编程详解 | 深入浅出Go语言原生数据库编程
Golang数据库编程详解 | 深入浅出Go语言原生数据库编程
|
5天前
|
Go 开发者
Golang深入浅出之-Go语言流程控制:if、switch、for循环详解
【4月更文挑战第21天】本文介绍了Go语言中的流程控制语句,包括`if`、`switch`和`for`循环。`if`语句支持简洁的语法和初始化语句,但需注意比较运算符的使用。`switch`语句提供多分支匹配,可省略`break`,同时支持不带表达式的形式。`for`循环有多种形式,如基本循环和`for-range`遍历,遍历时修改原集合可能导致未定义行为。理解并避免易错点能提高代码质量和稳定性。通过实践代码示例,可以更好地掌握Go语言的流程控制。
11 3
Golang深入浅出之-Go语言流程控制:if、switch、for循环详解
|
5天前
|
Go
Golang深入浅出之-Go语言函数基础:定义、调用与多返回值
【4月更文挑战第21天】Go语言函数是代码组织的基本单元,用于封装可重用逻辑。本文介绍了函数定义(包括基本形式、命名、参数列表和多返回值)、调用以及匿名函数与闭包。在函数定义时,注意参数命名和注释,避免参数顺序混淆。在调用时,要检查并处理多返回值中的错误。理解闭包原理,小心处理外部变量引用,以提升代码质量和可维护性。通过实践和示例,能更好地掌握Go语言函数。
19 1
Golang深入浅出之-Go语言函数基础:定义、调用与多返回值
|
6天前
|
Go
Golang深入浅出之-Go语言基础语法:变量声明与赋值
【4月更文挑战第20天】本文介绍了Go语言中变量声明与赋值的基础知识,包括使用`var`关键字和简短声明`:=`的方式,以及多变量声明与赋值。强调了变量作用域、遮蔽、初始化与零值的重要性,并提醒读者注意类型推断时的一致性。了解这些概念有助于避免常见错误,提高编程技能和面试表现。
20 0
|
6天前
|
安全 Java Linux
Golang深入浅出之-初识Go语言:语言特点与开发环境搭建
【4月更文挑战第20天】Go语言(Golang)由Google于2009年推出,以其简洁语法、高效执行、强大的并发模型和丰富标准库著称。主要特点包括:1) 代码结构清晰,易于阅读;2) 编译速度快,运行效率高,内置垃圾回收;3) 使用goroutines和channels实现并发;4) 标准库涵盖网络、并发等多个领域;5) 支持跨平台编译。要搭建开发环境,需下载Go SDK,配置环境变量,并验证安装。常见问题涉及导入包未使用、错误处理、并发安全和`defer`语句的使用。
15 0
|
6月前
|
存储 编译器 Go
Golang 语言的多种变量声明方式和使用场景
Golang 语言的多种变量声明方式和使用场景
33 0
|
6月前
|
缓存 编译器 Go
Golang 语言 vendor 在 GOPATH 和 Modules 中的区别
Golang 语言 vendor 在 GOPATH 和 Modules 中的区别
31 0
|
6月前
|
Go 数据中心 微服务
Golang 语言微服务的服务发现组件 Consul 的系统架构介绍
Golang 语言微服务的服务发现组件 Consul 的系统架构介绍
59 0