[golang基础] 局部变量初始化:=

一 基础用法

操作 := 只能用于方法内部, 声明并初始化新的变量

v := 3

但是不能用于已声明变量赋值, 下面的做法编译器会报错误"no new variables on left side of :="

var v int = 0
v := 1

通过错误可以了解到, := 操作左边必须要有新变量, 那么多个变量初始化只需要满足左边至少有一个新变量即可

err := errors.New("error1")
ret, err := test_fun()

这种做法是合法的, 因为ret是新变量, 这样就很方便了, 因为go方法经常会返回错误err, 那么在同一个方法内

只需要声明一个err变量即可

二 :=陷阱

由于:=只能用于局部变量, 那么下面的代码会发生什么情况呢?

var out int = 1

func test() {
    out, in := 2, 3
}

变量out的作用域包含test(), 但是实际上:= 操作会新创建新的局部变量out, 谨记!!!

那么类似情况:

func test1() {
    v := 1
    {
        v := 1
    }
}

编译器会不会报"no new variables on left side of :="? 编译器没有报错,所以两个v是不同的变量

在go中 if for switch都可能产生特殊作用域的局部变量,在if for switch中有变量赋值时需要注意 :=

结论:

1 := 左边出现了同层作用域的局部变量,只是赋值操作,没有新生成局部变量

2 := 左边出现了上层作用域的局部变量,新生成同名局部变量并赋值

3 := 左边出现了非局部变量,生成与非局部变量同名的局部变量

时间: 2024-10-11 16:14:49

[golang基础] 局部变量初始化:=的相关文章

[golang 易犯错误] golang 局部变量初始化:=的陷阱

我们知道,golang中局部变量初始化方法(使用“:=”创建并赋值),让我们在使用变量时很方便.但是,这也是易犯错误的地方之一.特别是这个初始化符还支持多个变量同时初始化,更特别的是它还支持原有变量赋值和新变量创建并赋值同时进行!也就是说如果有部分变量不存在的而另外一些是已声明好的,用:=来初始化部分变量同样有效.这其实也没什么,更方便了嘛.但是,go的好多语句还支持局部前置语句,比如在if,for,switch等语句的初始化条件语句中.在这些地方,当你以为使用了原有变量的时候,实际上go已经为

Golang基础入门

Go语言很容易上手 第一步,在你的计算机上安装Go语言环境 首先下载对应操作系统的安装包或者源文件 Windows和Mac OSX 都有安装包,可以选择直接双击安装,很简单 Ubuntu系统可以使用 apt-get 安装 sudo apt-get install golang 当然,你也可以选择使用源码包安装 获取源码: $ hg clone -u release https://code.google.com/p/go 进入到源码目录,运行安装脚本 $ cd go/src $ ./all.ba

golang基础归纳

1. hello-world package main import "fmt" func main(){ fmt.Println("Hello world, Go Go!"); fmt.Printf("type of Hello is %T\n", "Hello") } package main--每一个Go文件都应该在开头进行package name的声明(注:只有可执行程序的包名为main).包用于代码的封装与重用,这里

Golang基础学习总结

1.不支持继承 重载 ,比如C++Java的接口,接口的修改会影响整个实现改接口的类行为的修改,Go 设计者认为这一特点或许根本没用. 2.必任何函数定义必须花括号跟在函数声明后面而不能换行 如 func  funca(a int){},在Go语言中 函数也是一种类型 可以被推导  使用支持匿名函数 和闭包. 函数的返回值支持多重返回类似Python , 如果不赋值  整数类型默认 0     浮点数类型默认0.0   error类型 默认是nil 3.不用的包一定不要引入,这是Go的原则,就如

深入理解函数内静态局部变量初始化

函数内部的静态局部变量的初始化是在函数第一次调用时执行; 在之后的调用中不会对其初始化. 在多线程环境下,仍能够保证静态局部变量被安全地初始化,并只初始化一次.下面通过代码来分析一些具体的细节: void foo() { static Bar bar; // ... } 通过观察 gcc 4.8.3 为上述代码生成的汇编代码, 我们可以看到编译器生成了具有如下语义的代码: void foo() { if ((guard_for_bar & 0xff) == 0) { if (__cxa_guar

JAVA基础之初始化与清理

用构造器确保初始化 构造器与类名称相同;是一种特殊类型的方法,因为它没有返回值. 在创建对象时,会为对象分配存储空间,并调用相应的构造器. 不包含任何参数的构造器叫做默认构造器 方法重载 class Person { public Person() {} public Person(String name){} public Person(String name,int age){} } 区分重载 每个方法都有独一无二的参数类型列表 方法重载 1.如果传入的数据类型小于方法中声明的形式参数类型,

[转]C/C++关于全局变量和局部变量初始化与不初始化的区别

原文链接:http://www.kingofcoders.com/viewNews.php?type=newsCpp&id=189&number=4836955386 在C语言里,全局变量如果不初始化的话,默认为0,也就是说在全局空间里:int x =0; 跟 int x; 的效果看起来是一样的.但其实这里面的差别很大,强烈建议大家所有的全局变量都要初始化,他们的主要差别如下: 编译器在编译的时候针对这两种情况会产生两种符号放在目标文件的符号表中,对于初始化的,叫强符号,未初始化的,叫弱符

C/C++关于全局变量和局部变量初始化与不初始化的区别

在C语言里,全局变量如果不初始化的话,默认为0,也就是说在全局空间里: int x =0; 跟 int x; 的效果看起来是一样的.但其实这里面的差别很大,强烈建议大家所有的全局变量都要初始化,他们的主要差别如下: 编译器在编译的时候针对这两种情况会产生两种符号放在目标文件的符号表中,对于初始化的,叫强符号,未初始化的,叫弱符号.连接器在连接目标文件的时候,如果遇到两个重名符号,会有以下处理规则:1.如果有多个重名的强符号,则报错.2.如果有一个强符号,多个弱符号,则以强符号为准. 3.如果没有

python基础--局部变量与全局变量

首先来看两张图,局部变量与全局变量的区别: 局部变量: class MyClass(): def a(self): n=100 print('a中的n数值为:%d'%(n)) def b(self): n=n+200 print('b中的n数值为:%d'%(n)) 这个时候就会报错,函数b中的n=n+200会显示n未定义错误,原因是n只是在函数a中定义了一个值100,但是函数b中并未赋值,如果还是要使用n这个数值,就可以定义一个全局变量,表示区分我这里写成_n 全局变量: _n=1111 cla