zoukankan      html  css  js  c++  java
  • Go语言变量和常量

    一、变量相关

    1.变量声明

    C# : int a;

    Go : var a int; 需要在前面加一个var关键字,后面定义类型

    可以使用 var( a int; b string;)减少var

     

    2.变量初始化

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

    在:=左侧的变量不应该是已经被声明过的

     

    3.变量赋值

    注意:Go语言的新特性 “Simultaneous Assignment” (平行赋值、多重赋值 ......)

    a,b = b,a 可以方便的交换两个数的值,之前的其他语言可能都需要加一个temp变量

    (对于如和实现的,http://golang.org/ref/spec#Assignments 进行了阐述)

    对于这个我其实是有疑问的,就是Go语言是如何实现该功能的?按照我的想法如果是go语言底层也是按照加入一个变量的方式,那么岂不是输出的a和b都是b的值了?达不到交换的目的。所以我查了一些资料如下:

    http://stackoverflow.com/questions/35951423/simultaneous-variable-assignment-in-go-different-from-individual-variable-assign

    大概结论就是,这个赋值操作可以看成一个原子操作。

    4.匿名变量

    Go可以定义匿名变量来减少不需要的代码,例如,我只关心Value,不想打印Key的时候可以用“_”代替变量。同理对于有多个返回值的方法,可以用“_”代替我不想要的返回值,这样就减少了变量的定义。

    func main(){
           x:=make(map[string]int16)
           x["apple"] =100
           x["orange"] = 50
           x["pear"]=500
           for _,value := range x{
                  fmt.Println(value);
           }
    }

    二、常量相关

    1.字面常量

    Go语言的字面常量是无类型的,可以被赋值给任何类型的变量。

    例如 AConstNumber 可以赋值给int、float32等类型,但是赋值给string就出错了

    package main
    import ( "fmt")
    
    func main(){
           const AConstNumber = -100
           var x int = AConstNumber
           var y float32 = AConstNumber
           fmt.Println("x:",x)
           fmt.Println("y:",y)
    }

    2.预定义常量

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

    iota是个什么玩意?

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

    例如:

    func main(){
           const(
                  a = iota *100
                  b = iota *100
                  c = iota *100
           )
           const(
                  d = iota *100
                  e = iota *100
                  f = iota *100
           )
           fmt.Println(a)  // 打印 0
           fmt.Println(b)  // 打印 100
           fmt.Println(c)  // 打印 200
           fmt.Println(d)  // 打印 0
           fmt.Println(e)  // 打印 100
           fmt.Println(f)  // 打印 200
    }

    所以 iota 这个东西用好了就能当枚举使用了,正好Go语言不支持enum关键字

  • 相关阅读:
    LA 2038 Strategic game(最小点覆盖,树形dp,二分匹配)
    UVA 10564 Paths through the Hourglass(背包)
    Codeforces Round #323 (Div. 2) D 582B Once Again...(快速幂)
    UVALive 3530 Martian Mining(贪心,dp)
    UVALive 4727 Jump(约瑟夫环,递推)
    UVALive 4731 Cellular Network(贪心,dp)
    UVA Mega Man's Mission(状压dp)
    Aizu 2456 Usoperanto (贪心)
    UVA 11404 Plalidromic Subsquence (回文子序列,LCS)
    Aizu 2304 Reverse Roads(无向流)
  • 原文地址:https://www.cnblogs.com/dcz2015/p/10095969.html
Copyright © 2011-2022 走看看