Go 语法糖

简介: Go 语法糖

语法糖


语法糖通常是用来简化代码编写的,特性就是使用语法糖前后编译的结果是相同的。

go语言的语法糖最具有代表性的莫过于海象表达式:=


1. 简短变量声明符


可以使用关键字var或者直接简短变量声明符:=声明变量,但是使用:=时要注意一些规则


1.1 规则1


多变量赋值可能会重新声明


package main
import "fmt"
func main(){
  a,b:=1,2
  fmt.Println(a,b)
  c,b:=4,5
  fmt.Println(c,b)
}


image.png

可以看到b的值发生了改变

但是如果:=左侧没有新变量的时候是不允许的


package main
import "fmt"
func main(){
  a,b:=1,2
  fmt.Println(a,b)
  a,b:=4,5
  fmt.Println(a,b)
}


image.png


当然,我们重新声明变量的时候还要注意一个问题,那就是变量声明要在同一个作用域中出现;如果在不同作用域中出现,很有可能就创建了新的同名变量。


1.2 规则2


不能用于函数外部


简短变量声明符只能用于函数中,使用:=声明或者初始化全局变量会出错

可以这样理解,我们使用:=时其实是完成了两步操作,第一步声明变量,第二步对声明的变量进行赋值。


而我们在函数外部只能以关键字开头,所以会产生报错。


1.3 规则3


变量作用域的问题


规则1中最后提到不应该在一个函数内部不同作用域中用:=去声明同名变量,这样往往会在不经意间导致混淆出错。


package main
import "fmt"
func main(){
  i,j:=0,0
  if true{
    j,k:=1,1
    fmt.Println(j,k)
  }
  fmt.Println(i,j)
}


image.png

这里的j在不同作用域下就被赋予了不同的值,如果对j混淆操作就可能出错


2. 可变参函数


可变参函数是指函数的某个参数可有可无,个数不确定。声明时需要在参数类型前面加上…前缀


比如最常用的fmt.Println()它的实现就是…interface{},即传入多个接口

最基本的例子


package main
import "fmt"
func Hello(word string,names ...string){
  if names==nil{
    fmt.Println("Nobody!")
    return
  }
  for _,people:=range names{
    fmt.Println(word,people)
  }
}
func main(){
  Hello("hi","a","b","c")
  Hello("hi",[]string{"a","b","c","d"}...)
}
复制代码


image.png

首先说说可变参函数的特点


  • 可变参数必须在可变参函数的尾部,也就是最后一个
  • 可变参数在函数内部是作为切片来解析的
  • 可变参数可以不填,不填的时候函数内部当做nil切片处理
  • 可变参数必须是相同的类型,如果是不同的类型可以定义为interface{}接口类型去实现


再来看看上面的例子,我们如果向可变参函数的可变参数传入切片类型的时候,函数参数部分使用的时候必须使用slice…来表示切片

另外,当我们传入切片的时候并不会产生新的切片,所以函数内部使用的切片和传入的切片是共享存储空间的。 当我们在函数内部修改切片时,也会影响外部调用的切片,所以这个一定要注意。

目录
相关文章
Go语言,语法糖注意
可变参数必须在函数参数列表的最后一个(否则会引起编译时歧义);可变参数在函数内部是作为切片来解析的;
60 0
Go语言,语法糖注意
|
XML JSON Kubernetes
go系列2】 关于go中与java C++中应该注意的语法糖以及不同点
go系列2】 关于go中与java C++中应该注意的语法糖以及不同点
184 0
go系列2】 关于go中与java C++中应该注意的语法糖以及不同点
|
18小时前
|
存储 Go API
一个go语言编码的例子
【7月更文挑战第2天】本文介绍Go语言使用Unicode字符集和UTF-8编码。Go中,`unicode/utf8`包处理编码转换,如`EncodeRune`和`DecodeRune`。`golang.org/x/text`库支持更多编码转换,如GBK到UTF-8。编码规则覆盖7位至21位的不同长度码点。
58 1
一个go语言编码的例子
|
1天前
|
IDE Linux Go
记录一个go语言与IDE之间的问题
【7月更文挑战第1天】本文介绍在IDE中调试Go应用可能遇到的问题。当问题与IDE的自动完成有关,可以试着使用其他编辑器如Linux的vim是否无此问题。这可以验证表明IDE可能不完全兼容最新语言版本,建议使用无自动检测工具临时解决。
16 0
|
1天前
|
安全 Go
Go语言的iota关键字有什么用途?
**Go语言中的`iota`是常量生成器,用于在`const`声明中创建递增的常量。`iota`在每个新的`const`块重置为0,然后逐行递增,简化了枚举类型或常量序列的定义。例如,定义星期枚举:** ```markdown ```go type Weekday int const ( Sunday Weekday = iota // 0 Monday // 1 Tuesday // 2 ... ) ``` 同样,`iota`可用于定义不同组的常量,如状态码和标志位,保持各自组内的递增,提高代码可读性。
|
3天前
|
JSON 算法 测试技术
在go语言中调试程序
【6月更文挑战第29天】Go语言内置`testing`包支持单元测试、基准测试和模糊测试。`go test`命令可执行测试,如`-run`选择特定测试,`-bench`运行基准测试,`-fuzz`进行模糊测试。
16 2
在go语言中调试程序
|
5天前
|
编译器 Go C++
必知的技术知识:go语言快速入门教程
必知的技术知识:go语言快速入门教程
|
6天前
|
编译器 Go 开发者
|
6天前
|
Devops Go 云计算
Go语言发展现状:历史、应用、优势与挑战
Go语言发展现状:历史、应用、优势与挑战
|
7天前
|
Go
go语言map、实现set
go语言map、实现set
13 0