go基础编程day2类型、变量、常量、运算符

2018-06-19  本文已影响0人  james_chang

const var type几个关键词的简单使用

package main

import "fmt"

// 定义常量
const (
    P      = 3.14
    const1 = 1
    const2 = "2"
    const3 = 3
)

//全局变量的声明与赋值
var (
    name  = "james"
    age   = 18
    name2 = "nihao"
)

// 一般类型的声明 type关键字
type (
    newType int
    type1   float32
    type2   string
)

func main() {
    fmt.Printf("Hello %s!\n", name) // Hello james!
}

重点理解第三个type关键词,已知这些类型,int,string等等,但是type可以声明自己的类型,这里newType属于一个新的类型,但是他的基础类型还是int,但跟int并不是同一个类型newType是他的命名

go基本类型

注意区分值类型和引用类型,会在后面变量传递的时候有区别

类型零值

零值并不等于空值,而是当变量被声明为某种类型后的默认值,就是说你在声明他的时候就存在值了,通常情况下值类型的默认值为0,比如int,就是一个0,slice就是多个或一个0,bool的默认值为false,string为空的字符串

package main

import "fmt"

func main() {
    var a int
    var b []int
    var c string
    var d bool
    fmt.Println(a)
    fmt.Println(b)
    fmt.Println(c)
    fmt.Println(d)
}

/*
0
[]

false
*/

类型别名

// 一般类型的声明 type关键字
type (
    newType int
    type1   float32
    type2   string
)

就是为类型起一个别名,注意的是基础类型与别名之后的类型并不完全对等,赋值等等需要转换

单个变量的声明与赋值

这个我刚看也有点愁人,声明和赋值的方法很多,并不是会简单好用的一种就够了,毕竟也要读别人的代码,所以必须全部掌握

第一种:声明-赋值

package main

import "fmt"

func main() {
    // 声明 var-命名-类型
    var a int
    // 赋值
    a = 111
    fmt.Println(a) // 111
}

第二种:类型推断

package main

import "fmt"

func main() {
    // 赋值并类型推断
    var a = 111
    fmt.Println(a) // 111
}

第三种:声明并赋值简单写法

package main

import "fmt"

func main() {
    // 声明并赋值简单写法
    a := 111
    fmt.Println(a) // 111
}

这些方式不仅适用int等等这些类型的声明,也适用一些其他类型的声明,所以要掌握

系统推断的声明赋值前提是在使用过程中值的类型不会发生转变,否则会抛出错误

声明赋值变量要注意的点:

package main

import "fmt"

// 全局变量 支持多个变量赋值,支持并行,不可省略var
var (
    a      = "hello"
    b      = "hi"
    aa, bb = 1, 2
)

func main() {
    // 不可以使用括号,但是可以使用并行,可以省略var使用简写
    var a, b, c, d int
    a, b, c, d = 1, 2, 3, 4
        // 也可以忽略赋值,只用_来代替变量名,可用于多返回值但是不需要全部返回值的时候
        // 上面两句等价 var a, b, c, d int = 1, 2, 3, 4
    e, f, g := 5, "ss", 6
    fmt.Println(a, b, c, d, e, f, g)
}

变量的类型转换

package main

import "fmt"

func main() {
    var a float32 = 1.1
    b := int(a)
    fmt.Println(b) // 1

    var c bool = true
    d := int(c) // cannot convert c (type bool) to type int
}

要注意数字转字符串的时候会转为对应的字母,想要真正的转换成字符串需要库strconv

package main

import "fmt"
import "strconv"

func main() {
    var a int = 65
    b := string(a)
    fmt.Println(b) // A
    // int转string
    c := strconv.Itoa(a)
    fmt.Println(c) // 65
    d, e := strconv.Atoi(c)
    fmt.Println(d)
    fmt.Println(e)
}

常量及运算符

常量的定义

package main

import "fmt"

const a int = 2
const b = "A"

const (
    c = a + 1
    d = a * 3
    // 没有表达式或者常量的话会自动选择上一行的表达式,前提是这两行格式相同
    e
    f, g = 22, 33
)

func main() {
    fmt.Println(a) // 2
    fmt.Println(b) // A
    fmt.Println(c) // 3
    fmt.Println(d) // 6
    fmt.Println(e) // 6
    fmt.Println(f) // 22
    fmt.Println(g) // 33
}

常量的初始化规则与枚举

package main

import "fmt"

const (

    // 使用双引号是会输出字符串A,单引号输出对应的数字
    a = 'A'
    b
    // 此时iota为2
    c = iota
    d
)

const (
    // 新的关键词const iota从0开始
    e = iota
)

func main() {
    fmt.Println(a) // 65
    fmt.Println(b) // 65
    fmt.Println(c) // 2
    fmt.Println(d) // 3
    fmt.Println(e) // 0
}

枚举应用

package main

import (
    "fmt"
)

const (
    a      = 0
    Monday = iota
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
    Sunday
)

func main() {
    fmt.Println(Sunday) // 7
}

运算符

新接触:
>> << 左移/右移多少位
& | ^ &^ 四个位运算符

/*
6:  0110
11: 1011

---------

两个数位运算先转换为2进制

&   0010 = 2    和
|   1111 = 15   或
^   1101 = 13   对比过程中只存在一个1则为1
&^  0100 = 4    如果第二个数对应的位置为1,则将第一个数对应的位置转换为0
之后再转换回10进制

*/

func main() {
    fmt.Println(6 & 11)  // 2
    fmt.Println(6 | 11)  // 5
    fmt.Println(6 ^ 11)  // 13
    fmt.Println(6 &^ 11)  // 4
}

单个的&变为了位运算符,&&作为‘与’运算符,左边条件不成立则右边不执行

实现计算机存储单位的枚举

const (
    B float64 = 1 << (iota * 10)
    KB
    MB
    GB
    TB
)

func main() {

    fmt.Println(B)  // 1
    fmt.Println(KB)  // 1024
    fmt.Println(MB)  // 1.048576e+06
    fmt.Println(GB)  // 1.073741824e+09
    fmt.Println(TB)  // 1.099511627776e+12
}

指针

指针属于要深入了解的东西,

package main

import (
    "fmt"
)

func main() {
    a := 1
    // 声明指向int的指针p
    var p *int
    // 赋值p
    p = &a
    fmt.Println(p) // 0xc420014100
    fmt.Println(&a) // 0xc420014100
    fmt.Println(a) // 1
}
上一篇 下一篇

猜你喜欢

热点阅读