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语言,语法糖注意
可变参数必须在函数参数列表的最后一个(否则会引起编译时歧义);可变参数在函数内部是作为切片来解析的;
83 0
Go语言,语法糖注意
|
XML JSON Kubernetes
go系列2】 关于go中与java C++中应该注意的语法糖以及不同点
go系列2】 关于go中与java C++中应该注意的语法糖以及不同点
210 0
go系列2】 关于go中与java C++中应该注意的语法糖以及不同点
|
20天前
|
存储 Go 索引
go语言中数组和切片
go语言中数组和切片
32 7
|
20天前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
20天前
|
程序员 Go
go语言中结构体(Struct)
go语言中结构体(Struct)
93 71
|
19天前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
100 67
|
22天前
|
Go 索引
go语言for遍历数组或切片
go语言for遍历数组或切片
91 62
|
24天前
|
并行计算 安全 Go
Go语言中的并发编程:掌握goroutines和channels####
本文深入探讨了Go语言中并发编程的核心概念——goroutine和channel。不同于传统的线程模型,Go通过轻量级的goroutine和通信机制channel,实现了高效的并发处理。我们将从基础概念开始,逐步深入到实际应用案例,揭示如何在Go语言中优雅地实现并发控制和数据同步。 ####
|
20天前
|
存储 Go
go语言中映射
go语言中映射
32 11
|
22天前
|
Go
go语言for遍历映射(map)
go语言for遍历映射(map)
31 12