从零开始学Go之基本(一):基本数据类型与变量

基本数据类型:

Go中数据类型并不是特别多,但是有一部分用法却比较多,这一部分放到后面再细学。

 

Go中的基本数据类型有:

①整型:int,uint

②浮点型:float32,float64

③布尔型:bool

④字符型:byte,rune

⑤字符串型:string

⑥复数型:complex64,complex128

 

整型可以按长度分为int8,int16,int32,int64和对应无符号版本的uint8,uint16,uint32,uint64

uint8就是byte型,int16对应C中的short,int64对应C中的long

 

浮点数需要改变对应精度输出(即保留小数点后位数)使用格式化输出的动词%f,例子:

fmt.Printf("%..f\n",math.Pi)

可以用math包中的math.MaxFloat32和math.MaxFloat64来获取浮点数范围的常量值

 

bool只有两个值true和false,不初始化的情况下默认为false

 

字符类型统一用''来表示单个字符;byte是uint8类型,代表了ASCII码的一个字符,类似C中的char;rune是int32类型,代表一个UTF-8字符,由于长度变长,可以表示中文日文或者其他复合字符

(如果byte中存在中文会出现溢出错误)

 

string用""来处理单行字符,识别转义符;用``来处理多行字符,不识别转义符。string内部实际是由uint8类型的切片组成,使用UTF-8编码,由于长度不足,非ASCII字符是以占两个字节的方式保存在string中的,如果存在非ASCII字符时遍历很容易出现不符合预期的情况,一般需要转义成rune切片再遍历。同时string是只读的字节切片,不可以直接改变,但是转义成rune切片后可以改变。

func main() {
 var a string
 a = "asd测试一号"
 fmt.Printf("a[0]类型:%T\n", a[0]) //uint8
 //a[0]='f' 无法编译
​
 var b byte
 //b='中' 错误:constant 20013 overflows byte
 fmt.Printf("b:%v\n", b)
​
 var c string
 c = "α"
​
 fmt.Print("c遍历:")
 for i := 0; i < len(c); i++ {
  fmt.Printf("%v\t", c[i]) //两个字节
 }
 fmt.Println()
​
 d := []rune(c)        //转义为rune切片
 fmt.Printf("d[0]类型:%T\n", d[0]) //uint8
 fmt.Print("d遍历:")
 for i := 0; i < len(d); i++ {
  fmt.Printf("%v\t", d[i])
 }
 fmt.Println()
 d[0] = 'β' //可以直接修改
 fmt.Print("d:")
 fmt.Println(d)
}

运行结果

a[0]类型:uint8
b:0
c遍历:206 177 
d[0]类型:int32
d遍历:945 
d:[946]

常用转义符:

\r:回车符

\n:换行符

\t:制表符

\':单引号

\":双引号

\\:反斜杠


复数默认输出是(x+yi)的形式,可以直接通过complex(x, y),如果只赋一个值则只会改变实数部分,通过real和imag函数返回实数和虚数部分

 

变量:

变量声明:

基本操作:var 变量名 变量类型

var a int

 

批量操作:

var (

变量名 变量类型

……

)

var (
 a int
 b string
)

 

在Go中,声明局部变量未使用会发生编译错误,但声明全局变量未使用不会发生编译错误

 

变量初始化:

初始化默认值(即声明变量但没有进行初始化操作):

整型、浮点型:0

字符串:""

布尔:bool

复数:(0+0i)

切片、函数、指针:nil

func main() {
    var(
        a int
        b float64
        c string
        d bool
        e []float32
        f func()
        g *types.Pointer
        h complex128
    )
    fmt.Println(a)
    fmt.Println(b)
    fmt.Println(c)
    fmt.Println(d)
    fmt.Println(e)
    fmt.Println(f)
    fmt.Println(g)
    fmt.Println(h)
}

运行结果

0
0
​
false
[]
<nil>
<nil>
(0+0i)

(如果用C/C++的话就一定习惯在使用前进行初始化操作,例一个字符串不初始化就没有结束符/0,由于VC编译器未初始化栈空间以0xCC填充,堆空间用0xCD填充,对应烫和屯,就出现了烫烫烫烫梗)

 

初始化操作:

标准:var 变量名 类型 = 表达式

简化:var 变量名 = 表达式

var a int = 100
​
var b =0.64

在简化的初始化操作中,会根据右边表达式推导变量类型,如果为小数,则会尽量提高精确度,使用float64类型

 

初始化操作也可以跟批量操作

var(
 a int = 100
 b float64 = 0.64

 

短变量:

变量名 := 表达式

a, b := 10, 0.64

这是Go中的一个特别声明并初始化的方法,是初始化操作的更简化版。

要注意的是短变量声明中变量名必须是之前没有定义过的变量否则会报错编译错误,如果是同时赋值多个短变量,只有有一个变量是新变量即可以使用短变量

 

多变量赋值:

变量名1,变量名2,... = 表达式1,表达式2,...

a, b = b, a
c, d := Function()

在Go中当多个变量需要同时赋值的时候,会按照变量的左值和右值从左到右处理,也可以使用短变量或者函数返回值。多变量赋值也可以用于完成无需临时变量的变量交换

 

匿名变量:

_,变量名1 := 忽略表达式,表达式1

_, a := 1, 2

当不需要接受对应的变量时使用“_”下划线,此时只有变量a接收到2。匿名变量不占用命名空间同时不分配内存

posted @ 2019-06-23 00:54  VingB2by  阅读(198)  评论(0编辑  收藏  举报