变量

声明变量格式:

var var_name var_type

变量在声明时会自动初始化:

数字: 0
string: ""
bool: false
引用类型: nil
结构体: 所有元素或成员的零值

var 通常用于与初始化表达式类型不一致的局部变量、后面再赋值或初始值不重要的情况,否则可以使用更加简便的短变量声明

短变量声明

短变量声明更加简便,变量类型会通过变量初始值自动判断

短变量声明用于局部变量声明,最少声明一个变量

a := 1

多变量赋值

多个变量可以在一起赋值

var a, b, c int
d, e, f := 1, 2, "I'm F"
var(
a = 1
b int
)

局部变量

局部变量声明就必须使用,否则编译时会报错

// 可以先声明,再初始化
var a int
a = 1 // 可以在声明的同时进行初始化
var a int = 1
// Go 可以在初始化的时候自动判断变量类型,所以 int 可以省略
var a = 1 // var a = 1 的简略写法,同样会自动判断
a := 1

全局变量

全局变量声明后可以不使用,编译时不会报错

全局变量首字母必须大写,否则从其他包中就无法访问到

由于所有语句必须在函数中,所以无法通过 := 声明全局变量,全局变量只能通过 var 进行声明

var A int = 1

或者可以通过初始化函数对其进行初始化

var A int

func init() {
A = 3
}

只写变量 _

由于 Go 中不允许出现局部变量声明后不使用的情况,但是有时会出现需要接收一个值,但是之后又不会用到

如果直接声明一个变量去接收,由于之后没有用到,所以编译无法通过,这时就可以使用只写变量 _ 来接收之后用不到的值

变量作用域

函数内声明的变量是局部变量,只在函数内有效

函数外部声明的是全局变量,如果首字母小写,只能在当前包中访问;如果首字母大写,可以在其他包中访问到

变量的生命周期

变量的生命周期由变量是否可达决定

包级别变量的生命周期是整个程序的执行时间

局部变量的生命周期则不一定

逃逸

示例:

var global *int
func foo() {
x := 1
global = &x
}

虽然 x 是局部变量,但是由于 global 引用了 x,所以即使函数返回,x 仍然可达,不会被回收,这时 x 从 foo 中逃逸

常量

常量在编译时就会确定,之后无法修改

常量声明和变量相似,但是声明时必须要有值

格式:

const const_name const_type = value

变量的类型可以省略

多行声明:

const(
blog = "cnblogs.com/dbf-/"
Pi = 3.14159
)

计算表达式

常量可以使用计算表达式,但是只能用内置的常量计算表达式

const(
a = "123"
length = len(a)
)

自动填充

在给第一个常量赋值之后,如果之后的没有赋值,就会自动赋为上面的值

常量生成器 (iota)

声明常量时可以通过 iota 实现自增

示例:

package main

import "fmt"

const(
a = iota
b = "string"
c
d = iota
e
)
const(
f = iota
g
h
) func main() {
fmt.Println(a, b, c, d, e)
fmt.Println(f, g, h)
}

输出结果:

0 string string 3 4
0 1 2

在一个 const 中使用 iota 后,就会自动从第一个开始计数,为之后每一个常量分配一个值,虽然中间被其他的赋值打断,但是计数器仍然在工作

在一个新的 const 中,计数器会重新计数

值类型

基本数据类型:int、float、bool、string、struct 等都是值类型

值类型中储存的就是值

内存通常在栈中分配

引用类型

指针、切片、map、chan 等都是引用类型

引用类型中储存的是内存地址,内存地址指向的才是值

内存通常在堆中分配

Go 变量(var) & 常量(const)的更多相关文章

  1. JS 的三种定义变量 var let const

    Let 只在 let 命令所在的代码块内有效,在外就会报错 Let 是块级作用域,函数内部使用let定义后,对函数外部无影响 Let/const 不存在变量提升,使用前一定要声明后,在使用,否则会报错 ...

  2. 宏(define)与常量(const)

    http://mp.weixin.qq.com/s?__biz=MzAxMzE2Mjc2Ng==&mid=402470669&idx=1&sn=e34db91190d8d46f ...

  3. ES6和ES5变量声明的区别(var let const)

    // es5的语法与es6的语法区别 // var let const console.log(name);//undefine,不会报错,因为变量声明会提到作用域的最前面 var name=&quo ...

  4. javascript中var let const三种变量声明方式

    javascript中var let const三种变量声明方式 1.var  ①var表示声明了一个变量,并且可以同时初始化该变量. ②使用var语句声明的变量的作用域是当前执行位置的上下文:一个函 ...

  5. 浅谈JS中 var let const 变量声明

    浅谈JS中 var let const 变量声明 用var来声明变量会出现的问题: 1. 允许重复的变量声明:导致数据被覆盖 2. 变量提升:怪异的数据访问.闭包问题 3. 全局变量挂载到全局对象:全 ...

  6. 石川es6课程---3、变量let和常量const

    石川es6课程---3.变量let和常量const 一.总结 一句话总结: let非常好用,尤其是let的块级作用域可以解决之前要(function(){})()立刻执行函数做的块级作用域 1.js中 ...

  7. 【JS学习】var let const声明变量的异同点

    [JS学习]var let const声明变量的异同点 前言: 本博客系列为学习后盾人js教程过程中的记录与产出,如果对你有帮助,欢迎关注,点赞,分享.不足之处也欢迎指正,作者会积极思考与改正. 总述 ...

  8. swift-var/let定义变量和常量

    // Playground - noun: a place where people can play import UIKit //--------------------------------- ...

  9. Swift学习——变量var和let常量的用法(一)

    Swift中的变量var和let常量 首先介绍一下Swift中的 var 和 let (1)var 是 variable的缩写形式,是变量的意思 ,是可改变的.并非数据类型 比如: 注意每一个语句后面 ...

随机推荐

  1. ELK日志分析系统(2)-logspout收集容器日志

    1. 概述 安装了ELK之后,就是要考虑怎么获取log数据了. 收集log数据的方式有很多种: 1). beats采集数据发布到logstash 2). Filebeat采集数据发布到logstash ...

  2. icon图标深入指南

    图标是网络上常用的元素. 它们是通用的,可以立即识别,可以非常吸引人,引起注意,并且(如果使用正确)可以提供出色的用户体验. 在网络上实现图标时,我们有很多选择: Icon Spritesheet – ...

  3. synchronized凭什么锁得住?

    相关链接: <synchronized锁住的是谁?> 我们知道synchronized是重量级锁,我们知道synchronized锁住的是一个对象上的Monitor对象,我们也知道sync ...

  4. Fiddler常用设置

    1.设置抓取HTTPS请求 勾选后弹窗添加证书确认框 点击yes后,弹出警告 点击是,成功添加证书 点击OK确认,设置成功了 成功抓取到HTTPS请求 2.自定义会话框,展示GET和POST请求 3. ...

  5. Redis速记

    参考: 集群 https://blog.csdn.net/xiaoxiaoyusheng2012/article/details/82051744 主从 https://blog.csdn.net/u ...

  6. PWA学习笔记(二)

    设计与体验 APP Shell: 1.应用从显示内容上可粗略划分为内容部分和外壳部分,App Shell 就是外壳部分,即页面的基本结构 2.它不仅包括用户能看到的页面框架部分,还包括用户看不到的代码 ...

  7. 浅谈——MySQL存储引擎

    博文大纲: 一.MyISAM存储引擎: 二.InnoDB存储引擎: 三.Memory存储引擎特点: 四.如何选择合适的存储引擎? 前言 数据库存储引擎是数据库底层软件组件,数据库管理系统(DBMS)使 ...

  8. Java+TestNG+Maven+Excel+IDEA接口自动化入门(一)环境配置

    前置: 1.本机环境安装了maven并配置环境变量 2.本机环境安装了IDEA软件 3.本机环境安装了Java jdk 8版本 4.有一定java和maven基础 因为以上网上例子很多,就不再重复赘述 ...

  9. Linux目录详解,软件应该安装到哪个目录

    原文地址:https://www.w3h5.com/post/336.html 我们应该知道 Windows 有一个默认的安装目录专门用来安装软件.Linux 的软件安装目录也应该是有讲究的,遵循这一 ...

  10. 2017 经典的CVPR 关于ImageCaptioning论文

    1.        SCA-CNN: Spatial and Channel-wise Attention in Convolutional Networks for Image Captioning ...