一起来学Go --- (go的变量)

变量

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

变量的声明

  go语言引入了关键字ver,而类型信息放在变量名之后。示例如下:

var v1 int

var v2 string

var v3 [10]int    //数组

var v4 []int        //数组切片

var v5 struct  {
       f int
        }            

var v6 *int        // 指针

var v7 map[strint]int     //map,key为string类型,value为int类型

var v8 func(a int) int

变量声明语句不需要使用分号作为结束语,与C语言相比,go语言摒弃了语句必须以分号作为语句结束标记的习惯。

var关键字的另一种用法是可以将若干个需要声明的变量放置在一起,免得程序员需要重复写var关键字,如下图:

var (
      v1 int   
      v2 string
)

变量初始化

  对于声明变量时需要进行初始化的场景,var关键字可以保留,但不再是必要的元素,如下所示:

//正确的使用方式1
var v1 int =10

//正确的使用方式2,编译器可以自动推导出v2的类型
var v2 = 10

//正确的使用方式3,编译器可以自动推导出v3的类型
v3 := 10

  以上三种用法的效果是一样的,与第一种用法相比,第三种用法需要输入的字符数大大减少,这里go语言也引入了另一个c和c++中没有的符号(冒号和等号的组合:=),用于明确表达同时进行变量声明和初始化的工作。

指定类型已不再是必须得,go编译器可以从初始化表达式的右值推导出该变量应该声明为那种类型,这让go语言看起来有点像 动态类型语言,尽管go语言实际上是不折不扣的强类型语言(静态类型语言)

当然,出现  :=左侧的变量不应该是已经被声明过的,否则会导致编译错误,比如下面这个:

var i int
i := 2

会导致类似如下的编译错误

no new variables on left side of :=

变量赋值

  在go语法中,变量初始化和变量赋值是两个不同的概念,下面为声明一个变量之后的赋值过程:

var  v10  int
v10 = 123

  go语言的变量赋值与多数语言一直,但go语言中 提供了c/c++程序员期盼多年的多重赋值功能,比如下面这个交换  i  和  j   变量的语句:

i , j = j , i
在不支持多重赋值的语言中,交互两个变量的内容需要 引入一个中间变量。

t = i; i = j; j = t;

  多重赋值的特性在go语言库的实现中也被使用得相当充分,在介绍函数的多重返回值时,将对其进行更加深入的介绍 ,总而言之 ,多重赋值功能让go语言与C/C++语言相比非常明显地减少代码行数 。

匿名变量

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

假设:GetNmae()函数的定义如下,它返回三个值,分别为 firstName、lastName和nickName:

func GetName() (firstName, lastName, nickName string) {
      return "may", "Hello", "World"  
}

  若只想获得nickName,则函数调用语句可以用如下方式编写:

_, _, nickName := GetName()

  这种用法可以让代码非常清晰,基本上屏蔽掉了可能混淆大家实现的内容,从而大幅度降低沟通的复杂度和代码为何的难度。

常量

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

字面常量

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

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

  只要这个常量在响应类型的值域范围内,就可以作为该类型的常量。

 常量的定义

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

const Pi float64 = 3.14159265358979323846

const zero = 0.0       //无类型浮点常量

const (
     size int64 = 1024
     eof = -1              //无类型整数常量  
)

const u, v float32 = 0, 3 // u = 0.0, v = 3.0, 常量的多场赋值

const a, b, c = 3, 4, "foo"

// a = 3, b = 4, c = "foo"     ,无类型整型和字符串常量

  go的常量定义可以限定类型,但不是必须的,如果定义常量时没有指定类型,那么它与字面常量一样,是无类型常量。

预定义常量

  go的语言预定义了这些常量: true ,  false和iota。

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

从以下列子当中可以基本理解iota的用法:

const(                     // iota被重设为0
    c0 = iota             // c0 == 0
    c1 = iota             // c1 == 0
    c2 = iota             // c2 == 0
)


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


const (
      u    = iota * 42      // u == 0          iota在每个const开头被重设为0
      v  float64  = iota * 42    // b == 2
      c = 1 << iota         // c == 4

)

const(
    u        = iota * 42      // u == 0
    v float64 = iota * 42  // v == 42.0
    w        = iota * 42     // w == 84

)

const x = iota       //  x == 0 itao又被重设为0

const y = iota       // y == 0 同上

  如果两个const的赋值语句的表达式是一样的,那么可以省略后一个赋值表达式,因此,上面的前两个const语句可简写为:

const (
        c0 = iota         // iota被重设为0
        c1                   // c1 == 1     
        c2                   // c2 == 2
)    


const (
        a = 1 << iota            // a == 1
        b                              // b == 2
        c                              // c == 4

)

  小结: 本章只是学习go的基本的变量,变量的定义,常量等。

       定义变量关键字:    var

       定义常量关键字 :   const

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏desperate633

详解排序算法--插入排序和冒泡排序插入排序和冒泡排序分析

冒泡排序(英语:Bubble Sort,台湾另外一种译名为:泡沫排序)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把...

801
来自专栏老马说编程

计算机程序的思维逻辑 (15) - 初识继承和多态

继承 上节我们谈到,将现实中的概念映射为程序中的概念,我们谈了类以及类之间的组合,现实中的概念间还有一种非常重要的关系,就是分类,分类有个根,然后向下不断细化...

2139
来自专栏程序员互动联盟

【面试宝典】static 关键字

面试官:static关键字你了解吗?说一下你的认识。 小白:啊.....有点晕呀,这么宽泛的问题,我该从哪回答呢?头脑一片空白。让我想想...... 面试官:没...

3666
来自专栏一个爱吃西瓜的程序员

一文读懂正则表达式的基本用法

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过...

991
来自专栏向治洪

Kotlin语法基础之运算符

运算符 计算机程序中最小的程序单位成为表达式,每个表达式都可以由两部分组成,即操作数和运算符。操作数可以是变量、常量、类、数组、方法等,甚至是其他表达式。而运算...

2745
来自专栏程序员互动联盟

【编程基础】C++ Primer快速入门之七:运算符

一、表达式的定义 什么是表达式?表达式,是由数字、运算符、数字分组符号(括号)、自由变量和约束变量等以能求得数值的有意义排列方法所得的组合(1)。1 + 2是个...

3114
来自专栏HTML5学堂

操作符与数据类型转换

上一期堡堡给大家讲解了关于JS的基础语法,虽然是一些非常基础的知识,但是它对大家的后期学习奠定了一定的基础。知识像一张网,基础越扎实,网住的鱼就越多,要告诉大家...

3098
来自专栏北京马哥教育

Python语言中list及tuple的使用示例

Python语言中的list Python有一种内置数据类型被称为列表:list。 1.list基本定义 list是一种有序的集合,可以随时添加和删除其中的元...

3257
来自专栏小樱的经验随笔

KMP算法学习(详解)

kmp算法又称“看毛片”算法,是一个效率非常高的字符串匹配算法。不过由于其难以理解,所以在很长的一段时间内一直没有搞懂。虽然网上有很多资料,但是鲜见好的博客能简...

3095
来自专栏轮子工厂

让我第3不开心的事是:同样是程序员,你竟然选择了偷懒~

好几个人在后台催更C语言教程,其实我也很委屈鸭,呆博去浪去了,然后他就义正言辞的和我说不想排版推文,一听就是想要偷懒的借口,口亨~

1033

扫码关注云+社区

领取腾讯云代金券