Go语言,语法糖注意

简介: 可变参数必须在函数参数列表的最后一个(否则会引起编译时歧义);可变参数在函数内部是作为切片来解析的;

下面两个程序运行结果是?


func main() {
  i := 0
  i, j := 1, 2
  fmt.Printf("i = %d, j = %d", i, j)
}
复制代码

func main() {
  i, j := 0, 0
  if true {
    j, k := 1, 1
    fmt.Printf("j = %d, k = %d\n", j, k)
  }
  fmt.Printf("i = %d, j = %d\n", i, j)
}
复制代码
  1. 下面程序为什么不能通过编译
func test(i int) {
  i := 0
  fmt.Println(i)
}
复制代码

答案:


i = 1, j = 2


j = 1, k = 1

i = 0, j = 0


形参已经声明了变量i,使用 := 再次声明是不允许的。

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

使用 := 一次可以声明多个变量,例如:

i, j := 0, 0
j, k := 1, 1
复制代码
  • := 左侧存在新的变量时(如 k),那么已经声明的变量(如 j)会被重新声明。这并没有引入新的变量,只是把变量的值改变了。
  • := 左侧没有新变量编译报错。

不能用于函数外部

  • := 这种简短变量声明只能用于函数中,用来初始化全局变量是不行的。
  • 可以理解成 := 会拆分成两个语句,即声明和赋值。赋值语句不能出现在函数外部的。

可变参数 ...

  • 可变参数必须在函数参数列表的最后一个(否则会引起编译时歧义);
  • 可变参数在函数内部是作为切片来解析的;
  • 可变参数可以不填,不填时函数内部当成 nil 切片处理;
  • 可变参数可以填入切片;
  • 可变参数必须是相同类型的(如果需要是不同类型的可以定义为interface{}类型);

例如:

func sum(a int, vals...int) int {
    total := a
    for _, val := range vals {
        total += val
    }
    return total
}
复制代码

不传值

fmt.Println(sum(1))          // "1"
复制代码

传递多个参数

fmt.Println(sum(1, 2, 3, 4, 5)) // "15"
复制代码

传递切片

参数部分需要使用 slice... 来表示切片,例如

values := []int{1, 2, 3, 4, 5}
fmt.Println(sum(1, values...)) // "16"


相关文章
|
8天前
|
JSON 中间件 Go
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
本文详细介绍了如何在Go项目中集成并配置Zap日志库。首先通过`go get -u go.uber.org/zap`命令安装Zap,接着展示了`Logger`与`Sugared Logger`两种日志记录器的基本用法。随后深入探讨了Zap的高级配置,包括如何将日志输出至文件、调整时间格式、记录调用者信息以及日志分割等。最后,文章演示了如何在gin框架中集成Zap,通过自定义中间件实现了日志记录和异常恢复功能。通过这些步骤,读者可以掌握Zap在实际项目中的应用与定制方法
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
|
1天前
|
安全 Java Go
探索Go语言在高并发环境中的优势
在当今的技术环境中,高并发处理能力成为评估编程语言性能的关键因素之一。Go语言(Golang),作为Google开发的一种编程语言,以其独特的并发处理模型和高效的性能赢得了广泛关注。本文将深入探讨Go语言在高并发环境中的优势,尤其是其goroutine和channel机制如何简化并发编程,提升系统的响应速度和稳定性。通过具体的案例分析和性能对比,本文揭示了Go语言在实际应用中的高效性,并为开发者在选择合适技术栈时提供参考。
|
5天前
|
运维 Kubernetes Go
"解锁K8s二开新姿势!client-go:你不可不知的Go语言神器,让Kubernetes集群管理如虎添翼,秒变运维大神!"
【8月更文挑战第14天】随着云原生技术的发展,Kubernetes (K8s) 成为容器编排的首选。client-go作为K8s的官方Go语言客户端库,通过封装RESTful API,使开发者能便捷地管理集群资源,如Pods和服务。本文介绍client-go基本概念、使用方法及自定义操作。涵盖ClientSet、DynamicClient等客户端实现,以及lister、informer等组件,通过示例展示如何列出集群中的所有Pods。client-go的强大功能助力高效开发和运维。
22 1
|
5天前
|
SQL 关系型数据库 MySQL
Go语言中使用 sqlx 来操作 MySQL
Go语言因其高效的性能和简洁的语法而受到开发者们的欢迎。在开发过程中,数据库操作不可或缺。虽然Go的标准库提供了`database/sql`包支持数据库操作,但使用起来稍显复杂。为此,`sqlx`应运而生,作为`database/sql`的扩展库,它简化了许多常见的数据库任务。本文介绍如何使用`sqlx`包操作MySQL数据库,包括安装所需的包、连接数据库、创建表、插入/查询/更新/删除数据等操作,并展示了如何利用命名参数来进一步简化代码。通过`sqlx`,开发者可以更加高效且简洁地完成数据库交互任务。
13 1
|
11天前
|
XML JSON Go
微服务架构下的配置管理:Go 语言与 yaml 的完美结合
微服务架构下的配置管理:Go 语言与 yaml 的完美结合
|
11天前
|
程序员 Go
Go 语言:面向对象还是非面向对象?揭开编程语言的本质
Go 语言:面向对象还是非面向对象?揭开编程语言的本质
|
5天前
|
算法 NoSQL 中间件
go语言后端开发学习(六) ——基于雪花算法生成用户ID
本文介绍了分布式ID生成中的Snowflake(雪花)算法。为解决用户ID安全性与唯一性问题,Snowflake算法生成的ID具备全局唯一性、递增性、高可用性和高性能性等特点。64位ID由符号位(固定为0)、41位时间戳、10位标识位(含数据中心与机器ID)及12位序列号组成。面对ID重复风险,可通过预分配、动态或统一分配标识位解决。Go语言实现示例展示了如何使用第三方包`sonyflake`生成ID,确保不同节点产生的ID始终唯一。
go语言后端开发学习(六) ——基于雪花算法生成用户ID
|
6天前
|
JSON 缓存 监控
go语言后端开发学习(五)——如何在项目中使用Viper来配置环境
Viper 是一个强大的 Go 语言配置管理库,适用于各类应用,包括 Twelve-Factor Apps。相比仅支持 `.ini` 格式的 `go-ini`,Viper 支持更多配置格式如 JSON、TOML、YAML
go语言后端开发学习(五)——如何在项目中使用Viper来配置环境
|
11天前
|
存储 编译器 Go
Go语言中的逃逸分析
Go语言中的逃逸分析
|
11天前
|
存储 Go
掌握 Go 语言的 defer 关键字
掌握 Go 语言的 defer 关键字