Go语言的常量和变量学习

1.Go 语言变量

        Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。

        声明变量的一般形式是使用 var 关键字:

var identifier type

        可以一次声明多个变量:

var identifier1, identifier2 type

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

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

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

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

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

var i int

i := 2

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

        no new variables on left side of :=

        声明一个变量之后的赋值过程:

var v10 int

v10 = 123

        Go语言的变量赋值与多数语言一致,但Go语言中提供了C/C++程序员期盼多年的多重赋值功

能,比如下面这个交换i和j变量的语句:

i, j = j, i

        空白标识符 _ 也被用于抛弃值,如值 5 在:_, b = 5, 7 中被抛弃。

        _ 实际上是一个只写变量,你不能得到它的值。这样做是因为 Go 语言中你必须使用所有被声明的变量,但有时你并不需要使用从一个函数得到的所有返回值。

        并行赋值也被用于当一个函数返回多个返回值时,比如这里的 val 和错误 err 是通过调用 Func1 函数同时得到:val, err = Func1(var1)。

2.Go 语言

1>.const

        通过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的常量定义可以限定常量类型,但不是必需的。如果定义常量时没有指定类型,那么它与字面常量一样,是无类型常量。

        你可以省略类型说明符 [type],因为编译器可以根据变量的值来推断其类型。

        显式类型定义: const b string = "abc"

        隐式类型定义: const b = "abc"

        常量定义的右值也可以是一个在编译期运算的常量表达式,可以用len(), cap(), unsafe.Sizeof()函数计算表达式的值。比如

const mask = 1 << 3

a = "abc"

b = len(a)

c = unsafe.Sizeof(a)

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

const Home = os.GetEnv("HOME")

        原因很简单,os.GetEnv()只有在运行期才能知道返回结果,在编译期并不能确定,所以

无法作为常量定义的右值。

2>.预定义常量iota

        iota,特殊常量,可以认为是一个可以被编译器修改的常量。

        iota 在 const关键字出现时将被重置为 0(const 内部的第一行之前),const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)。

        iota 可以被用作枚举值:

const (

    a = iota

    b

    c

)
const (

    a = iota

    b = iota

    c = iota

)

        第一个 iota 等于 0,每当 iota 在新的一行被使用时,它的值都会自动加 1;所以 a=0, b=1, c=2 可以简写为如下形式:

示例:

package main


import "fmt"


func main() {

    const (

            a = iota   //0

            b          //1

            c          //2

            d = "ha"   //独立值,iota += 1

            e          //"ha"   iota += 1

            f = 100    //iota +=1

            g          //100  iota +=1

            h = iota   //7,恢复计数

            i          //8

    )

    fmt.Println(a,b,c,d,e,f,g,h,i)

}

结果:0 1 2 ha ha 100 100 7 8

        又如:i=1<<0, j=3<<1,k=3<<2,l=3<<3。(<< 表示左移的意思)

简单表述:

i=1:左移 0 位,不变仍为 1。

j=3:左移 1 位,变为二进制 110,即 6。

k=3:左移 2 位,变为二进制 1100,即 12。

l=3:左移 3 位,变为二进制 11000,即 24。

注:<<n==*(2^n)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值