go语言学习笔记 — 基础 — 基本语法 — 常量与变量 — 常量变量的声明:多个变量的初始化声明与赋值

Posted Locutus

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go语言学习笔记 — 基础 — 基本语法 — 常量与变量 — 常量变量的声明:多个变量的初始化声明与赋值相关的知识,希望对你有一定的参考价值。

1. 声明的方式

  • 多个变量声明与赋值
// 为类型相同的多个变量赋值

var vname1, vname2, vname3 type
vname1, vname2, vname3 = v1, v2, v3
  • 并行赋值
var vname1, vname2, vname3 type = v1, v2, v3
  • 自动类型推断
// 和python很像,不需要显示声明类型,自动推断

var vname1, vname2, vname3 = v1, v2, v3 
  • 最简写法(首选,只能在函数体内部使用的变量初始化声明)

在相同的代码块中,我们不可以再次对于相同名称的变量使用初始化声明,例如:a := 20 就是不被允许的,编译器会提示错误 no new variables on left side of :=,但是 a = 20 是可以的,因为这是给相同的变量赋予一个新的值。

// 出现在:=左侧的变量不应该是已经被声明过的,否则会导致编译错误

vname1, vname2, vname3 := v1, v2, v3

在多个短变量声明和赋值中,最简写法需要至少有一个新声明的变量出现在左值中,即使其他变量名可能是重复声明的,编译器也不会报错。

conn, err = net.Dial("tcp", "127.0.0.1:8080)

conn2, err = net.Dial("tcp", "127.0.0.1:8080)

2. 声明的地方

  • 全局变量组声明:var()因式分解写法(只用于全局变量的声明)

可以使用并行方式和自动类型推断,不可以用最简写法,因为:用于代替var关键字,而前面var()已经有了var。使用关键字 var 和括号,可以将一组变量声明放在一起。

// 这种因式分解关键字的写法一般用于声明全局变量

var (
    vname1 type1
    vname2 type2
)
  • 函数体内部变量声明

使用上述常见的4种变量声明方式即可。例子:

package main

import (
	"fmt"
)

// 全局变量组声明(var()因式分解写法)
var (
	aaa = "hello"      // 1. 使用常规方式
	ddd, bbb = 1, 2    // 2. 使用并行方式及自动类型推断
	// ccc := 3        // 3. 在var()中,不可以用最简写法。因为:用于代替var关键字,而前面已经有了var
)

// 函数体内部局部变量声明
func main() {
	// 1. 多个变量声明与赋值(用于函数体内部的局部变量声明)
	var a, b, c, d int
	a, b, c, d = 1, 2, 3, 4

	// 2. 并行方式
	var e, f, g, h int = 5, 6, 7, 8

	// 3. 自动类型推断
	var i, j, k, l = 9, 10, 11, 12

	// 4. 最简写法
	l, m, n, o := 13, 14, 15, 16

	fmt.Println(aaa, bbb, ddd)
	fmt.Println(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)
}

注意:

  • 全局变量的声明可使用var()因式分解写法进行简写。全局变量的声明不可以省略var,但可使用并行方式、自动类型推断
  • 所有变量都可以使用自动类型推断
  • 函数体内部的局部变量不建议使用var()因式分解写法简写,能使用并行方式、自动类型推断、最简写法
  • 变量在定义之前,不能使用它,否则会报编译错误undefined: a
  • 如果声明了一个局部变量却没有在相同的代码块中使用它,同样会得到编译错误a declared and not used;但是全局变量是允许声明但不使用
package main

import "fmt"

var b = 1

func main() {
	var a string = "abc"
	fmt.Println("hello, world", a)
}
  • 如果你想要交换两个变量的值,则可以简单地使用a, b = b, a,前提是两个变量的类型必须相同
  • 空白标识符_也被用于抛弃变量值,如值5在 _, b = 5, 7 中被抛弃了。_实际上是一个只写变量,你不能得到它的值。这样做是因为 Go 语言中你必须使用所有被声明的变量,但有时你并不需要使用一个函数的所有返回值
  • 并行赋值也被用于当一个函数返回多个返回值时,比如这里的 val 和错误 err 是通过调用 Func1 函数同时得到:val, err = Func1(var1)

3. 实例:交换两个变量的值

交换变量的常见算法需要一个中间变量进行变量的临时保存。用传统方法编写变量交换代码如下:

package main 

import (
    "fmt"
)

func main() {
    var a int = 100
    var b int = 200 
    var t int = 300

    t = a
    a = b
    b = t
    
    fmt.Println(a, b)
}

现在,内存不再是紧缺资源,使用go语言写法可以更简单。使用go语言的"多重赋值"特性,可以轻松完成交换变量的任务:

package main 

import (
    "fmt"
)

func main() {
    var a int = 100
    var b int = 200 
    
    b, a = a, b
    
    fmt.Println(a, b)
}

注:

  • 多重赋值时,变量的左值和右值按从左到右,一一对应的顺序赋值
  • 多重赋值在go语言的错误处理和函数返回值中会大量地使用
package main

import (
	"fmt"
)

type IntSlice []int

func (p IntSlice) Len() int {
	return len(p)
}

func (p IntSlice) Less(i, j int) bool {
	return p[i] < p[j]
}

func (p IntSlice) Swap(i, j int) IntSlice {
	p[i], p[j] = p[j], p[i]
	return p
}

func main() {
	var a IntSlice

	a = []int{1, 2, 3}

	fmt.Println(a.Len())
	fmt.Println(a.Less(1, 2))
	fmt.Println(a.Swap(1, 2))
}

以上是关于go语言学习笔记 — 基础 — 基本语法 — 常量与变量 — 常量变量的声明:多个变量的初始化声明与赋值的主要内容,如果未能解决你的问题,请参考以下文章

go语言学习笔记 — 基础 — 基本语法 — 常量与变量 — 常量变量的声明:单个变量的声明与赋值

go语言学习笔记 — 基础 — 基本语法 — 常量与变量 — 变量的数值类型转换

go语言学习笔记 — 基础 — 基本语法 — 常量与变量 — 常量变量的声明:变量初始化声明和变量赋值

go语言学习笔记 — 基础 — 基本语法 — 常量与变量 — 常量变量的声明:多个变量的初始化声明与赋值

go语言学习笔记 — 基础 — 基本语法 — 常量与变量 — 变量的类型零值

go语言学习笔记 — 基础 — 基本语法 — 常量与变量 — 变量的生命周期:堆(heap)