go的变量redeclare的问题,golang的一个小坑

go的变量声明有几种方式:

1 通过关键字 var 进行声明

例如:var i int   然后进行赋值操作 i = 5

2 最简单的,通过符号 := 进行声明和赋值

例如: i:=5 golang会默认它的类型

下面看一段代码,我们先声明一个变量a,然后再重新声明变量a,b,在这个函数中,变量a被声明了2次,成为a的重声明(redeclare),执行结果为23

package main

import (

  "fmt"

)

func main(){

a:=1

a,b:=2,3

fmt.Println(a,b)

}

精彩的部分来了,请看第二段代码

package main

import (

  "fmt"

)

type A struct{

i int

}

func main(){

testA:=&A{}

testA.i=1

testA.i,b:=2,3

fmt.Println(testA.i,b)

}

我们定义了一个简单的结构体A,A中的成员变量为i,我们在testA.i,b:=2,3对成员变量进行了新的声明和赋值,执行会报错。

原因:这个问题Google上是有过讨论的

Unlike regular variable declarations, a short variable declaration may redeclare variables provided they were originally declared earlier in the same block with the same type, and at least one of the non-blank variables is new. As a consequence, redeclaration can only appear in a multi-variable short declaration. Redeclaration does not introduce a new variable; it just assigns a new value to the original.
从go的spec看,redeclare是一个赋值,不是创建个新变量,为什么对于成员变量不可以,只能暂时理解成设计问题吧

这里是一个小坑,玩golang的请注意

go的变量redeclare的问题,golang的一个小坑

时间: 2024-10-13 00:41:35

go的变量redeclare的问题,golang的一个小坑的相关文章

js变量提升的一个小坑

好久没写博客了,原本想实训结束能对整个实训项目认真总结一下,没想到回到学校一点都不轻松,最近在制作网页版简历,遇到了一个小问题,现在不总结以后肯定忙得顾不上,所以长话短说,抓紧时间写下来. 对js语法比较熟的同学可能都知道:js是没有块级作用域的,有一个新手很容易出错的地方 for(var i = 0 ; i < 10 ; i ++){ setTimeout(function(){ console.log(i) },1000*i) } 这段代码会输出10个10,而不是期望的1,2,...,10,

用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。

最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量.<s:iterator>标签有一个value属性,用来存放在Action类的方法中存数据的list集合,还有一个id,好像是说指定集合的索引的意思,就是给list集合遍历出来的每个对象加上一个数字标签,反正我是这么理解的,没用过.还有一个很重要,就是var变量,我在s:iterator按ctr

Id class 变量 的赋值规范 大驼峰和小驼峰 代码的格式和注释的类型

Id  classde 变量 的赋值规范  大驼峰和小驼峰  代码的格式和注释的类型   其实我认为这是非常重要的,只要是个开发人员都会写代码,但是做到这些的却不容易, 现在公司看中的是合作能力.沟通能力.和编码风格,这也是开发人员的素养和态度! 首先说id class和变量 当你给div或者其他元素标签地址或赋值事,一定要做到规范,当进入工作你写的代码不是给自己看的,即使是自己看,当你搁置一段时间再看也未必知道哪是哪,所以给值时要见名之意,尤其是要改掉用拼音的坏习惯!例如你写两个div一个放文

golang中的那些坑之迭代器中的指针使用

今天在编写代码的时候,遇到了一个莫名其妙的错误,debug了半天,发现这是一个非常典型且易犯的错误.记之 示例代码: package main import "fmt" type aa struct { x, y int } type bb struct { member aa } func main() { m := []*aa{} pool := []bb { { member: aa{x : 1,y : 1,}, }, { member: aa{x : 2,y : 2,}, },

Golang的一个CLI框架

因为机缘巧合,因为希望能在VPS中使用百度网盘,了解到了一个开源的项目BaiduPCS-Go,可以用来直接存取访问百度网盘,做的相当不错 而且看ISSUES,作者可能还是个学生,很强的样子.稍微看了下代码,发现了一个很不错的用来写命令行程序CLI的框架,也是在Github上开源的,因为Golang主要是用来写这个的,所以感觉比较有用的样子,学习一下,并且稍微做了个笔记. 这个框架就是 github.com/urfave/cli 稍微整理了下具体使用的方式 1,最初的版本,如何引入等等 packa

[Golang]实习最后一天小纪念+并行爬虫小练习

今天是我在公司实习的最后一天,一个月的时间真的是太短暂了,我非常享受在公司工作的这一个月,在这里Leader和同事们对我的帮助极大地促进了我技术水平的进步和自信心的提升,我发自内心地感谢白山云科技给我这样一个实习的机会,谢谢你们对我的无私帮助(虽然他们可能也看不到…). 眼看着暑假还剩不到一个月,其实我内心是不想离开这个公司的,但是想到开学以后又要有各种网络赛和区域赛,又有新生的到来,为了校队,我还是离开吧(虽然我回去也没啥卵用…). 实习期间第一次写函数式的程序,并且第一次完成了一个用于日志分

公开课|一个小运维的《Golang 入门心路历程》

成功不是将来才有的,而是从决定去做的那一刻起,持续累积而成. 视频版 公开课主要内容: 缘起 初识 熟悉 实践 爱上 缘起 本人之前是 hadoop hbase 运维,为了节约成本 hadoop client 都是多用户的,也就是不同的业务线在同一台机器上.导致一个问题就是一个业务资源占用高,跑死其他业务线.在这种情况下我就想如何解决这个问题呢?这时候我接触到了 Docker--实现资源隔离.随着对Docker的深入了解以及身边人经常谈论 Go 语言,我感觉 Go 语言很牛,平时开始慢慢关注 G

mysql 变量名称的使用不当的一个错误

对于开发来说重要的是按照规范进行开发. 昨天自己在进行开发测试的时候,编写mysql 的一个存储过程 ,代码是比较简单的 就是根据名称查询对应的数据并返回 DELIMITER // CREATE PROCEDURE proc1(name int) BEGIN select * from table_name where name=name; END // 大家可能注意到了一个变量名称 name 因为我的数据库中的一个字段的名称也是name 按照传统编程语言传递参数的特点查询应该是没有问题的,但是

GoWorld – 用Golang写一个分布式可扩展、可热更的游戏服务器

GoWorld代码:https://github.com/xiaonanln/goworld Golang具有运行效率高.内存安全等优良特性,因此是非常适合用来进行服务器开发.使用Golang开发游戏服务器有如下的优点: 运行效率远高于各种脚本语言,大幅度提升服务器承载能力 内存安全,不会像C++服务器那样出现内存错误导致服务器down机 Goroutine能够很好地利用多核计算能力,提升承载能力 Golang本身非常简单好用,大家都喜欢 然而使用Golang编写游戏服务器也面临一定的困难,主要