初探Golang顺序编程概念

Golang学习笔记,便于自己后续查看。

变量

变量是几乎所有编程语言中最基本的组成元素。从根本上说,变量相当于是对一块数据存储空间的命名,程序可以通过定义一个变量来申请一块数据存储空间,之后可以通过引用变量名来使用这块存储空间。
Go语言中的变量使用方式与C语言接近,但具备更大的灵活性。 

变量声明

Go语言的变量声明方式与C和C++语言有明显的不同。对于纯粹的变量声明,Go语言引入了关键字var,而类型信息放在变量名之后,示例如下:
var v1 int
var v2 string
var v3 [10] int  // 数组
var v4 [] int  // 数组切片
var v5 struct {
f int
}
var v6 *int   // 指针
var v7 map[string]intvar v8 func(a int) int   // map,key为string类型,value为int类型
变量声明语句不需要使用分号作为结束符。与C语言相比,Go语言摒弃了语句必须以分号作为语句结束标记的习惯。 

变量初始化 


对于声明变量时需要进行初始化的场景,var关键字可以保留,但不再是必要的元素,如下 :
var v1 int = 10 // 正确的使用方式1
var v2 = 10 // 正确的使用方式2,编译器可以自动推导出v2的类型
v3 := 10 // 正确的使用方式3,编译器可以自动推导出v3的类型 
以上三种用法的效果是完全一样的。与第一种用法相比,第三种用法需要输入的字符数大大减少,是懒程序员和聪明程序员的最佳选择。这里Go语言也引入了另一个C和C++中没有的符号 (冒号和等号的组合:=),用于明确表达同时进行变量声明和初始化的工作 。
指定类型已不再是必需的,Go编译器可以从初始化表达式的右值推导出该变量应该声明为 4
哪种类型,这让Go语言看起来有点像动态类型语言,尽管Go语言实际上是 不折不扣 的强类型语言(静态类型语言)。
当然,出现在:=左侧的变量不应该是已经被声明过的,否则会导致编译错误,比如下面这个 :
var i inti := 2
会导致类似如下的编译错误:
no new variables on left side of :=


变量赋值在Go语法中,变量初始化和变量赋值是两个不同的概念。下面为声明一个变量之后的赋值
过程:
var v10 intv10 = 123
Go语言的变量赋值与多数语言一致,但Go语言中提供了C/C++程序员期盼多年的多重赋值功能,比如下面这个交换i和j变量的语句:
i, j = j, i 
在不支持多重赋值的语言中,交互两个变量的内容需要引入一个中间变量:
t = i; i = j; j = t;

匿名变量

我们在使用传统的强类型语言编程时,经常会出现这种情况,即在调用函数时为了获取一个值,却因为该函数返回多个值而不得不定义一堆没用的变量。在Go中这种情况可以通过结合使用多重返回和匿名变量来避免这种丑陋的写法,让代码看起来更加优雅。 
_, _, nickName := "May", "Chan", "Chibi Maruko" 

常量

在Go语言中,常量是指编译期间就已知且不可改变的值。常量可以是数值类型(包括整型、浮点型和复数类型)、布尔类型、字符串类型等 。
字面常量
所谓字面常量(literal),是指程序中硬编码的常量,如:
-12
3.14159265358979323846 // 浮点类型的常量3.2+12i // 复数类型的常量true // 布尔类型的常量"foo" // 字符串常量 


Go语言的字面常量更接近我们自然语言中的常量概念,它是无类型的。只要这个常量在相应类型的值域范围内,就可以作为该类型的常量,比如上面的常量12,它可以赋值给int、uint、int32、int64、float32、float64、complex64、complex128等类型的变量。 

常量定义

通过const关键字,你可以给字面常量指定一个友好的名字:
const Pi float64 = 3.14159265358979323846
const zero = 0.0 
const u, v float32 = 0, 3
const a, b, c = 3, 4, "foo"//a=3,b=4,c="foo", 无类型整型和字符串常量 

Go的常量定义可以限定常量类型,但不是必需的。如果定义常量时没有指定类型,那么它与字面常量一样,是无类型常量。常量定义的右值也可以是一个在编译期运算的常量表达式,比如:
const mask = 1 << 3
由于常量的赋值是一个编译期行为,所以右值不能出现任何需要运行期才能得出结果的表达式,比如试图以如下方式定义常量就会导致编译错误:
const Home = os.GetEnv("HOME") 
原因很简单,os.GetEnv()只有在运行期才能知道返回结果,在编译期并不能确定,所以无法作为常量定义的右值。

预定义常量

Go语言预定义了这些常量:truefalseiotaiota比较特殊,可以被认为是一个可被编译器修改的常量,在每一个const关键字出现时被常量定义,

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

const Pi float64 = 3.14159265358979323846  // 无类型浮点常量// 无类型整型常量
const u, v float32 = 0, 3
const a, b, c = 3, 4, "foo"//a=3,b=4,c="foo", 无类型整型和字符串常量
const zero = 0.0

Go的常量定义可以限定常量类型,但不是必需的。如果定义常量时没有指定类型,那么它与字面常量一样,是无类型常量。常量定义的右值也可以是一个在编译期运算的常量表达式,比如
const mask = 1 << 3

由于常量的赋值是一个编译期行为,所以右值不能出现任何需要运行期才能得出结果的表达式,比如试图以如下方式定义常量就会导致编译错误:
const Home = os.GetEnv("HOME")

原因很简单,os.GetEnv()只有在运行期才能知道返回结果,在编译期并不能确定,所以重置为0,然后在下一个const出现之前,每出现一次iota,其所代表的数字会自动增1。从以下的例子可以基本理解iota的用法: 
从以下的例子可以基本理解iota的用法:
const (
c0 = iota // iota被重设为0 // c0 == 0
c1 = iota // c1 == 1
c2 = iota // c2 == 2

const (
a = 1 << iota  // a == 1 (iota在每个const开头被重设为0)
b = 1 << iota  // b == 2
c = 1 << iota  // c == 4
)

类型


Go语言内置以下这些基础类型:

1
0
猜你在找
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
快速回复 TOP
    个人资料

    q454684431
    • 访问:242680次
    • 积分:3339
    • 等级:
    • 排名:第6049名
    • 原创:71篇
    • 转载:142篇
    • 译文:1篇
    • 评论:18条
    文章分类
  • 云计算(39)
  • linux(47)
  • 网络编程(11)
  • git(2)
  • python(29)
  • 生活感悟(5)
  • 虚拟化技术(18)
  • 镜像(2)
  • 数据库(6)
  • 消息机制(4)
  • c++(6)
  • 游戏3D(0)
  • boost库之家(5)
  • mac(1)
  • mysql(18)
  • ElasticSearch(10)
  • Docker(13)
  • MongoDB(5)
  • 上课(55)
  • 日志系统(10)
  • 笔试面试(23)
  • Linux内存管理(0)
    文章存档
  • 2016年03月(31)
  • 2016年02月(22)
  • 2016年01月(10)
  • 2015年12月(3)
  • 2015年11月(1)
  • 2015年10月(13)
  • 2015年09月(6)
  • 2015年08月(2)
  • 2015年07月(11)
  • 2015年01月(16)
  • 2014年09月(1)
  • 2014年06月(4)
  • 2014年05月(3)
  • 2014年04月(8)
  • 2014年01月(2)
  • 2013年11月(1)
  • 2013年09月(14)
  • 2013年08月(64)
    阅读排行
  • glance 模块内部结构(9779)
  • linux 如何改变include路径(9677)
  • 致青春(9626)
  • 与其担心未来,不如现在拼尽全力(9621)
  • keystone 安装、数据库配置(8824)
  • docker退出关闭容器(7786)
  • docker导入导出容器(7587)
  • elasticsearch搜索类型简介(7361)
  • python eventlet并发原理分析(7232)
  • 初探Golang顺序编程概念(7152)
    评论排行
  • linux面试之--堆、栈、自由存储区、全局/静态存储区和常量存储区(4)
  • python eventlet并发原理分析(4)
  • python中关于with及contextlib的用法(2)
  • 如何把oslo.config使用到自己的项目中(2)
  • python 线程池的研究及实现(2)
  • glance 上传镜像流程(1)
  • 消息机制qpid学习(下)(1)
  • linux中为什么要有分段和分页机制(1)
  • openstack中虚拟大神libvirt库(1)
  • LXC 轻量级虚拟化(0)
    推荐文章
    • *Xcode 调试方法总结
    • *Android框架设计模式(三)——Observer Method
    • *浅谈Storm流式处理框架
    • *有关深度学习领域的几点想法
    • * 管理Java垃圾回收的五个建议
    • * 大数据并发问题
    最新评论
  • linux面试之--堆、栈、自由存储区、全局/静态存储区和常量存储区

    q454684431: 所以你就看看可以了,在大众看来,堆和自由存储区一般是同一名词,而栈和自动存储区也是同一名词。

  • linux面试之--堆、栈、自由存储区、全局/静态存储区和常量存储区

    q454684431: 堆和自由存储区只是在c++语言中特分出来滴。自由存储区是C++两个动态内存区域之一,使用new和de...

  • linux面试之--堆、栈、自由存储区、全局/静态存储区和常量存储区

    qq_33934460: 堆和自由存储区有什么区别呢?c++中new缺省不是调用的malloc吗?

  • linux面试之--堆、栈、自由存储区、全局/静态存储区和常量存储区

    qq_33934460: 堆和自由存储区有什么区别呢?c++中new缺省不是调用的malloc吗?

  • linux中为什么要有分段和分页机制

    qq_33934460: 不愧是霸气活神仙!!!

  • python eventlet并发原理分析

    q454684431: @wangzy208: 依稀记得在我同事的github里,我试着给你找找啊。

  • python eventlet并发原理分析

    q454684431: @sinat_33504397: 卡住了? 是你调用sleep函数了还是你执行的是耗cpu型任务?如...

  • python eventlet并发原理分析

    sinat_33504397: 你好,我使用eventlet调度任务,经常会出现堵塞的情况。就是一个任务在那里卡住了,然后整个任务停...

  • 如何把oslo.config使用到自己的项目中

    q454684431: 意思是需要先加载client命令行参数,请会看文章提到的第三步说明。

  • 如何把oslo.config使用到自己的项目中

    VICTOR1984: 你好,我在启动nova-api服务的时候,会报错:cannot register CLI optio...

你可能感兴趣的:(docker,Go)