对于只有 Python 语言经验的朋友,也许会不太理解声明这个词,在 Python 中直接拿来就用,也不用声明类型啥的。

Go 语言是静态类型语言,由于编译时,编译器会检查变量的类型,所以要求所有的变量都要有明确的类型。

变量在使用前,需要先声明。声明类型,就约定了你这个变量只能赋该类型的值。

声明一般有以下四种方法,其中前面两种同样也可用于定义常量,只需把关键字 var 变成 const 即可。

第一种 :一行声明一个变量

var

其中 var 是关键字(固定不变),name 是变量名,type 是类型。

使用 var ,虽然只指定了类型,但是 Go 会对其进行隐式初始化,比如 string 类型就初始化为空字符串,int 类型就初始化为0,float 就初始化为 0.0,bool类型就初始化为false,指针类型就初始化为 nil。

若想在声明过程,顺便也初始化,可以这样写

var name sting = "Python编程时光"

在 Go 文件中的完整代码如下,为了不写重复性的代码,后续不再貼完整代码,只貼关键代码

package main

import "fmt"

func main() {

var name string = "Python编程时光"

fmt.Println(name)

}

从右值(等号右边的值,rvalue)来看,明显是个 string 类型(这里要注意,在 Python 双引号与单引号等价,但在 Go 中双引号和单引号是不一样的,这里要一定要使用双引号,表示字符串,而在单引号表示rune 类型的字符,这个后续会单独介绍),因此也可以将其简化为

var name = "Python编程时光"

若你的右值带有小数点,在不指定类型的情况下,编译器会将你的这个变量声明为 float64,但是很多情况下,我们并不需要这么高的精度(占用的内存空间更大)

这种情况下,推荐指定类型,不要偷懒

var rate float32 0.89

第二种:多个变量一起声明

声明多个变量,除了可以按照上面写成多行之外,还可以写成下面这样

var (

name string

age int

gender string

)

第三种:声明和初始化一个变量

使用 := (推导声明写法或者短类型声明法:编译器会自动根据右值类型推断出左值的对应类型。),可以声明一个变量,并对其进行(显式)初始化。

name := "Python编程时光"

// 等价于

var name string = "Python编程时光"

// 等价于

var name = "Python编程时光"

但这种方法有个限制就是,只能用于函数内部

第四种:声明和初始化多个变量

name, age := "wangbm", 28

这种方法,也经常用于变量的交换

var a int = 100

var b int = 200

b, a = a, b

第五种:new 函数声明一个指针变量

在这里要先讲一下,指针的相关内容。

变量分为两种 普通变量 和 指针变量

普通变量,存放的是数据本身,而指针变量存放的是数据的地址。

如下代码,age 是一个普通变量,存放的内容是 28,而 ptr 是 存放变量age值的内存地址:0xc000010098

package main

import "fmt"

func main() {

var age int = 28

var ptr = &age // &后面接变量名,表示取出该变量的内存地址

fmt.Println("age: ", age)

fmt.Println("ptr: ", ptr)

}

输出

age: 28

ptr: 0xc000010098

而这里要说的 new 函数,是 Go 里的一个内奸函数。

使用表达式 new(Type) 将创建一个Type类型的匿名变量,初始化为Type类型的零值,然后返回变量地址,返回的指针类型为*Type。

package main

import "fmt"

func main() {

ptr := new(int)

fmt.Println("ptr address: ", ptr)

fmt.Println("ptr value: ", *ptr) // * 后面接指针变量,表示从内存地址中取出值

}

输出

ptr address: 0xc000010098

ptr value: 0

用new创建变量和普通变量声明语句方式创建变量没有什么区别,除了不需要声明一个临时变量的名字外,我们还可以在表达式中使用new(Type)。换言之,new函数类似是一种语法糖,而不是一个新的基础概念。

如下两种写法,可以说是等价的

// 使用 new

func newInt() *int {

return new(int)

}

// 使用传统的方式

func newInt() *int {

var dummy int

return &dummy

}

以上不管哪种方法,变量/常量都只能声明一次,声明多次,编译就会报错。

但也有例外,这就要说到一个特殊变量:匿名变量,也称作占位符,或者空白标识符,用下划线表示。

匿名变量,优点有三:

不分配内存,不占用内存空间

不需要你为命名无用的变量名而纠结

多次声明不会有任何问题

通常我们用匿名接收必须接收,但是又不会用到的值。

func GetData() (int, int) {

return 100, 200

}

func main(){

a, _ := GetData()

_, b := GetData()

fmt.Println(a, b)

}

本篇文章由一文多发平台ArtiPub自动发布

python语言变量随时声明_2. Go语言五种变量创建的方法相关推荐

  1. python五种常见的排序方法是_python中序列的排序,sorted方法、reversed方法的使用...

    简介 INTRODUCTION 包括字典排序.列表排序.升序.降序.逆序 一.基础概念 我们知道python中的内建序列包括字典.列表.元组.字符串等,序列是python中最基本的数据结构. 列表.元 ...

  2. 独家 | 每个数据科学家应该知道的五种检测异常值的方法(附Python代码)

    作者:Will Badr 翻译:顾伟嵩校对:欧阳锦本文约1600字,建议阅读5分钟本文介绍了数据科学家必备的五种检测异常值的方法. 无论是通过识别错误还是主动预防,检测异常值对任何业务都是重要的.本文 ...

  3. python自带gui_Python GUI开发工具中五种类型的相关介绍

    Python这一计算机语言不仅具有十分简捷的操作功能,它还具有十分快速的相关开发功能,此文主要向你介绍的是关于Python GUI开发工具在实际相关应用操作过程中的具体操作,以及这几种开发工具相关内容 ...

  4. python学会了能做什么-学会Python后都能做什么?介绍五种Python的实用场景

    如今,越来越多的人加入到学习Python的队伍当中. 有的学习者是设计师,学习Python可以帮助他们查找更多的海报案例;有的学习者是大学生,学习Python可以帮助他们更好地查阅论文资料;还有的学习 ...

  5. 学python可以做什么-学会Python后都能做什么?介绍五种Python的实用场景

    如今,越来越多的人加入到学习Python的队伍当中. 有的学习者是设计师,学习Python可以帮助他们查找更多的海报案例;有的学习者是大学生,学习Python可以帮助他们更好地查阅论文资料;还有的学习 ...

  6. 【深度学习人类语言处理】1 课程介绍、语音辨识1——人类语言处理六种模型、Token、五种Seq2Seq Model(LAS、CTC、RNN-T、Neural Transducer、MoChA)

    Deep Learning for Human Ianguage Processing 1. DLHLP-Introduction 1.1 概述 1.2 六种模型与应用 1.2.1 语音到文本 1.2 ...

  7. 【C语言】-关于strlen的介绍以及三种模拟实现的方法

    作者:低调 作者宣言:写好每一篇博客 文章目录 前言 一.strlen函数的使用 二.strlen函数的模拟实现 2.1创建临时变量法 2.2递归法 2.3指针法 总结 前言 今天我们来讲解一下str ...

  8. Python炫技操作:模块重载的五种方法

    作者 | 写代码的明哥 来源 | Python编程时光 环境准备 新建一个 foo 文件夹,其下包含一个 bar.py 文件 $ tree foofoo└── bar.py 0 directories ...

  9. Python - 移除List中重复项的五种常用方法

    简 介: 本文列些处几种去除在Python 列表中(list)可能存在的重复项,这在很多应用程序中都会遇到的需求,作为程序员最好了解其中的几种方法 以备在用到时能够写出有效的程序. 关键词: list ...

最新文章

  1. CSDN中Markdown编辑器的数学公式编写(非常详细!)
  2. uva1347Tour
  3. Docker 安装创建
  4. [转]Myeclipse9引入easy_ui时,其中的部分js文件报错
  5. 原创 | 灵魂拷问:Java对象的内存分配过程是如何保证线程安全的?
  6. 《Cisco安全防火墙服务模块(FWSM)解决方案》——2.7 软件架构
  7. php操作大缓存的存储与读取
  8. Linux查看端口占用进程
  9. 昆仑通态复制的程序可以用吗_昆仑通态专题(十二):MCGS嵌入版组态软件的安全管理...
  10. 手机12306买卧铺下铺技巧_手机12306怎么买下铺
  11. 50 个实用小工具(图片处理、截屏录屏、格式转化、下载工具、浏览器、工具箱等)
  12. 面试算法 香槟塔 ,算法:暴力算法
  13. Entity Framework入门
  14. [TJOI2015]弦论
  15. 我的世界服务器怎么弄无限矿物,《我的世界》无限存储空间设备如何制作?
  16. pyScripter2.7 运行时提示远程解释器再初始化了
  17. 点点滴滴自学PS(一)批量去水印
  18. Python实验报告一 python基础试题练习
  19. 给自己的博客园装饰萌萝莉(live2d)
  20. Debezium系列之:使用Debezium接入SQL Server数据库数据到Kafka集群的详细技术文档

热门文章

  1. 适用于Java开发人员的Elasticsearch教程
  2. 使用cglib创建代理对象
  3. 使用JBoss EAP 7的HTTP / 2
  4. EE Servlet 3:简单表单处理
  5. 使用Spring-Cloud将Spring Boot应用程序部署到Cloud Foundry
  6. 查看您的Solr缓存大小:Eclipse Memory Analyzer
  7. 使用RequestHandlerRetryAdvice重试Web服务操作
  8. Java,Scala,Guava和Trove集合-它们可以容纳多少数据?
  9. 亚马逊DynamoDB
  10. Spring和JSF集成:分页