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"


相关文章
|
6天前
|
安全 网络协议 Go
Go语言网络编程
【10月更文挑战第28天】Go语言网络编程
94 65
|
6天前
|
网络协议 安全 Go
Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
【10月更文挑战第28天】Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
29 13
|
2天前
|
测试技术 Go
go语言中测试工具
【10月更文挑战第22天】
10 4
|
2天前
|
SQL 关系型数据库 MySQL
go语言中数据库操作
【10月更文挑战第22天】
12 4
|
2天前
|
缓存 前端开发 中间件
go语言中Web框架
【10月更文挑战第22天】
13 4
|
6天前
|
网络协议 安全 Go
Go语言的网络编程基础
【10月更文挑战第28天】Go语言的网络编程基础
23 8
|
5天前
|
Go
go语言的复数常量
【10月更文挑战第21天】
18 6
|
5天前
|
Go
go语言的浮点型常量
【10月更文挑战第21天】
13 4
|
5天前
|
编译器 Go
go语言的整型常量
【10月更文挑战第21天】
16 3
|
6天前
|
Go
go语言编译时常量表达式
【10月更文挑战第20天】
16 3