一、变量

package main

import "fmt"

func variableZeroValue() {
// 变量声明
var a int
var b string
fmt.Println(a, b) // 0
fmt.Printf("%d %q\n", a, b) // 0 ""
} func variableInitialValue() {
// 变量初始化
var a, b = 1, 2 // 编译器可以自动推导出变量的类型
c, d := 1, "pd" // 使用:=定义变量(只能在函数内使用)
a = 10 // 赋值不能使用 a := 10
a, b = b, a // 变量交换
fmt.Println(a, b, c, d)
} //在函数外定义变量,不能使用 :=
var a = 10
var b = 20
// 上面方式可以这样
var (
c = 30
d = 40
) func main() {
variableZeroValue()
variableInitialValue()
fmt.Println(a, b, c, d)
}
  • 变量类型写在变量名之后;
  • 编译器可以推测变量所属类型;
  • 没有char,只有rune;
  • 原生支持复数类型。

二、常量

在Go语言中,常量是指编译期间就已知且不可改变的值。常量可以是数值类型(包括整型、浮点型和复数类型)、布尔类型、字符串类型等。

一个常量的声明语句定义了常量的名字,和变量的声明语法类似,常量的值不可修改,这样可以防止在运行期被意外或恶意的修改。

2.1 字面常量

所谓字面常量(literal),是指程序中硬编码的常量,如:

-12
3.1415926 // 浮点类型的常量
3.2+12i // 复数类型的常量
true // 布尔类型的常量
"foo" // 字符串常量

2.2 常量定义

通过const关键字,可以给字面常量指定一个名字:

func constDefine() {
// 定义常量
/*
常量定义可以限定常量类型,但不是必需的。
如果定义常量时没有指定类型,那么它与字面常量一样,是无类型常量。
*/
const pi = 3.1415926
const zero = 0.0 // 无类型浮点常量
const (
size int64 = 1024
xx = -1 // 无类型整型常量
)
const a, b float32 = 1, 2 // 常量的多重赋值
const c, d, e = 3, 4, "foo"
fmt.Println(pi, zero, size, xx, a, b, c, d, e)
}

2.3 预定义常量

Go语言预定义了这些常量:true、false和iota。

iota比较特殊,可以被认为是一个可被编译器修改的常量,在每一个const关键字出现时被重置为0,然后在下一个const出现之前,每出现一次iota,其所代表的数字会自动增1。

func func1() {
const ( // iota被重设为0
c0 = iota // c0 == 0
c1 = iota // c1 == 1
c2 = iota // c2 == 2
)
fmt.Println(c0, c1, c2) // 0 1 2 const (
a11 = 1 << iota // a11 == 1 (iota在每个const开头被重设为0)
b11 = 1 << iota // b11 == 2
c11 = 1 << iota // c11 == 4
)
fmt.Println(a11, b11, c11) // 1 2 4
/*
如果两个const的赋值语句的表达式是一样的,那么可以省略后一个赋值表达式;
因此,上面的前两个const语句可简写为:
*/
const (
c00 = iota
c01
c02
)
const (
a22 = 1 << iota
b22 = 1 << iota
c22 = 1 << iota
) const (
b = 1 << (10 * iota)
kb
mb
gb
)
fmt.Println(b, kb, mb, gb) // 1 1024 1048576 1073741824
}

三、枚举

枚举指一系列相关的常量,比如下面关于一个星期中每天的定义。通过上一节的例子,我们看到可以用在const后跟一对圆括号的方式定义一组常量,这种定义法在Go语言中通常用于定义枚举值。Go语言并不支持众多其他语言明确支持的enum关键字。

下面是一个常规的枚举表示法,其中定义了一系列整型常量:

func enum() {
const (
Sunday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
numberOfDays // 这个常量没有导出
)
fmt.Println(Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday) // 0 1 2 3 4 5 6
}

同Go语言的其他符号(symbol)一样,以大写字母开头的常量在包外可见。

以上例子中numberOfDays为包内私有,其他符号则可被其他包访问。

Go:变量、常量、枚举的更多相关文章

  1. C#中常量\枚举\结构及数组的运用

    又一天结束了,今天在云和学院学习的知识下面继续来做总结. 一.常量\枚举\结构的运用 理论: 常量:const  类型 常量名 = 常量值 确定数量.确定值的几个取值:东西南北.男女.上中下. 枚举: ...

  2. JAVA之旅(一)——基本常识,JAVA概念,开发工具,关键字/标识符,变量/常量,进制/进制转换,运算符,三元运算

    JAVA之旅(一)--基本常识,JAVA概念,开发工具,关键字/标识符,变量/常量,进制/进制转换,运算符,三元运算 Android老鸟重新学一遍JAVA是什么感觉?枯燥啊,乏味啊,而且归纳写博客,都 ...

  3. iOS开发Swift篇(01) 变量&常量&元组

    iOS开发Swift篇(01) 变量&常量&元组 说明: 1)终于要写一写swift了.其实早在14年就已经写了swift的部分博客,无奈时过境迁,此时早已不同往昔了.另外,对于14年 ...

  4. C#基础总结之一变量常量-if嵌套语句-witch结构-类型转换

    //Console.WriteLine("Hello World"); //打印显示 //Console.ReadLine(); //接收输入的值 //Console.ReadKe ...

  5. 李洪强iOS开发Swift篇---11_变量&常量&元组

    李洪强iOS开发Swift篇---11_变量&常量&元组 说明: 1)终于要写一写swift了.其实早在14年就已经写了swift的部分博客,无奈时过境迁,此时早已不同往昔了.另外,对 ...

  6. PHP 获得当前页面所有变量常量的值

    get_defined_vars() - 返回由所有已定义变量所组成的数组,这个函数在二次开发的时候用起来非常给力: get_defined_constants();可以返回当前的所有常量 zend的 ...

  7. Cocos2D在新版Swift中常量枚举值引用代码的修改

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们知道在SpriteBuilder中是无法直接给一个CCB文 ...

  8. TF:Tensorflow定义变量+常量,实现输出计数功能—Jason niu

    #TF:Tensorflow定义变量+常量,实现输出计数功能 import tensorflow as tf state = tf.Variable(0, name='Parameter_name_c ...

  9. C#基础课程之二变量常量及流程控制

    课堂练习:.一个四位整数 输出它的千位,百位,十位,个位 数字. ; ; % ; % ; ; Console.WriteLine("千位数" + b+" 百位数" ...

  10. Swift-基础语法之变量&常量&元组

    使用 let来声明一个常量,用 var来声明一个变量.常量的值在编译时并不要求已知,但是你必须为其赋值一次.这意味着你可以使用常量来给一个值命名,然后一次定义多次使用 myVariable = let ...

随机推荐

  1. SQL Server: Difference between PARTITION BY and GROUP BY

    https://stackoverflow.com/questions/2404565/sql-server-difference-between-partition-by-and-group-by ...

  2. Could not find modernizr-2.6.2 in any of the sources GitLab: API is not accessible

    Could not find modernizr-2.6.2 in any of the sources GitLab: API is not accessible bundle exec rake ...

  3. LD_LIBRARY_PATH设置问题

    今天突然遇到设置LD_LIBRARY_PATH的问题,,发现在.bashrc和/etc/profile中添加 exportLD_LIBRARY_PATH = path_name:$LD_LIBRARY ...

  4. MySQL基础 — 详细安装

    MySQL--安装 打开MySQL 5.5 安装文件开始: 点击Next 打上勾,再点击Next 点击Custom,说明如下: Typical(典型安装)        Installs the mo ...

  5. bzoj 4806: 炮【dp】

    同1801 注意到一行只能放012个炮,我们只需要知道列的状态,不用状压行 所以设f[i][j][k]表示前i行有j列有1个炮,有k列有2个炮的方案数 然后分情况讨论转移就行了 #include< ...

  6. 20道spring boot面试题

    面试了少量人,简历上都说自己熟习 Spring Boot, 或者者说正在学习 Spring Boot,一问他们时,都只停留在简单的使用阶段,很多东西都不清楚,也让我对面试者大失所望. 下面,我给大家总 ...

  7. 洛谷 P1880 [NOI1995]石子合并

    题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...

  8. 二分图判定+点染色/并查集 BestCoder Round #48 ($) 1002 wyh2000 and pupil

    题目传送门 /* 二分图判定+点染色:因为有很多联通块,要对所有点二分图匹配,若不能,存在点是无法分配的,no 每一次二分图匹配时,将点多的集合加大最后第一个集合去 注意:n <= 1,no,两 ...

  9. 自定义View(10)*onSizeChanged,onMeasure,onDraw的注意事项及正确写法

    1,onSizeChanged 触发: 当view的第一次分配大小或以后大小改变时的产生的事件. 工作: 计算绘制内容的位置,面积等相关值.避免每次在onDraw中计算了. 注意: 计算时不要忘记pa ...

  10. log4net 简易封装

    using log4net; using log4net.Appender; using log4net.Config; using log4net.Core; using log4net.Layou ...