golang学习笔记-3

package main

import "fmt"

//编一个可执行的程序,必须 func main, main()入门函数

// go语言函数外的语句只能以关键字开头

var name = "哪吒"

var age int

//流程控制是一门语言的经脉

func main() {

    //函数内部定义的变量必须使用

    // age := 19

    // if age > 18{

    //  fmt.Println("澳门首家线上赌场开业了")

    // }else{

    //  fmt.Println("该写暑假作业了")

    // }

    if age := 19; age > 35 { //局部变量,作用域

        fmt.Println("人到中年")

    } else if age > 18 {

        fmt.Println("青年")

    } else {

        fmt.Println("好好学习")

    }

    //golang只有for循环

    for i := 0; i < 10; i++ {

        fmt.Println(i)

    }

    //变种1

    var i = 5

    for ; i < 10; i++ {

        fmt.Print(i)

    }

    //无限循环

    // for {

    // }

    //for range 数组,切片,管道,map,字符串

    //数组、切片、字符串返回索引和值, map返回键和值 3 通道 channel返回通道内的值

    //Switch case

    s := "hello 沙河"

    for i, v := range s {

        fmt.Printf("%d, %c\n", i, v)

    }

    for i := 1; i < 10; i++ {

        for j := 1; j <= i; j++ {

            fmt.Printf("%d*%d=%d\t", i, j, i*j)

        }

        fmt.Println()

    }

    //go install 先编译,后拷贝

    //go语言文件基础语法

    //.go 。go build -o "xxx.exe"

    //多行注释

    /*asdf*/

    //变量,三种方式,1  var name string 2 name := 3 var name="沙河哪吒"

    // 函数内部专属: name3 := "沙河小王子"

    //匿名变量,哑元变量。 当有些数据必须有变量接收,又不使用它,用 _ 接收

    //常量

    const PI2 = 3.1415926

    //两个要点

    //1 iota在const关键字出现时将被重置为0  2 const中每新增一行常量声明,iota累加1

    //整型,无符号整形 uint8,uint16,uint32,uint64

    // 带符号整形 int8,int16,int32,int64

    // int 具体是32 还是64 看操作系统

    //upintptr 无符号整形,存放一个指针

    //go语言中无法直接定义二进制数

    var f1 = 1.214

    fmt.Printf("%T\n", f1)

    var f2 = float32(1.233)

    fmt.Printf("%T\n", f2)

    //浮点数 默认 float64

    //byte  rune 类型都是类型别名

    for i := 0; i < 10; i++ {

        if i == 5 {

            break

        }

        fmt.Println(i)

    }

    fmt.Println("over")

    for i := 0; i < 10; i++ {

        if i == 5 {

            continue

        }

        fmt.Println(i)

    }

    finger := 3

    switch finger {

    case 1:

        fmt.Println("大拇指")

        fallthrough

    case 2:

        fmt.Println("食指")

    case 3:

        fmt.Println("中指")

        goto breakTag

    case 4:

        fmt.Println("无名指")

    case 5:

        fmt.Println("小拇指")

    default:

        fmt.Println("无效")

    }

    fmt.Println("sssssssssssssss")

breakTag:

    fmt.Println("safdds")

    //算术运算符

    var (

        a = 5

        b = 2

    )

    fmt.Println(a+b, a*b, a-b, a%b, a/b)

    a++ //单独的语句,不能放在=的右边赋值

    b--

    fmt.Println(a, b)

    //关系运算符

    fmt.Println(a == b, a > b, a < b, a != b, a<>b, b>>a)

    var name, age = "jack", 22

    if age > 18 && name != "jack" {

        fmt.Println("苦逼上班的")

    } else if age > 18 && name == "jack" {

        fmt.Println("家里有矿")

    } else {

        fmt.Println("真羡慕他么爽,不用上班")

    }

    //not 取反,

    var isMarried = false

    fmt.Println(isMarried, !isMarried)

    // 5: 101  2:10

    fmt.Println(5&2, 5|2, 5^2, 5<<1, 1<<10, (1<<10)<<10)

    var m = int8(1)

    fmt.Println(m << 5)

    // 192.168.1.1

    //权限,

    //赋值运算符,用来给变量赋值

    var x int

    x = 10

    x += 1

    x -= 1

    x *= 2

    x /= 2

    x %= 2

    x <<= 2

    x &= 2

    x |= 2

    fmt.Println(x)

    //复合数据类型,数组,类似容器,同一数据类型元素的集合,声明时确定,运行时可修改数组成员,数组大小不可变

    //必须指定存放元素的类型和长度,数组的长度是数组类型的一部分

    //var a1 [3]bool

    //a1[0],a1[1],a1[2]=false,true,false

    var a1 = [3]bool{true, true, false}

    for i, v := range a1 {

        fmt.Printf("%T,%v,%d\n", i, v, len(a1))

    }

    //数组的初始化,默认元素都是零值(false, 0, "")

    fmt.Println(a1)

    //初始值自动推断数组的长度

    a100 := [...]int{0, 1, 2, 4, 12, 13, 14}

    fmt.Println(len(a100))

    //根据索引来初始化

    a3 := [5]int{0: 1, 4: 2}

    fmt.Println(a3)

    city := [...]string{"北京", "上海", "深圳"}

    for i := 0; i < len(city); i++ {

        fmt.Println(city[i])

    }

    for i, v := range city {

        fmt.Println(i, v)

    }

    //多维数组

    //[[1,2,3],[2,3]]

    //var a4 [3][2]int //三个元素,每个元素有2个数组

    //**问题:**碰到golint 提示redundant type from array, slice, or map composite literal。

    // 数组、切片或映射复合文字中的冗余类型。

    a4 := [3][2]int{

        // [2]int{1, 2},

        // [2]int{3, 4},

        // [2]int{5, 6},

        0: {1, 2},

        1: {3, 4},

        2: {5, 6},

    }

    var foo = map[int][]int{

        0: {1, 2},

        1: {1, 2},

    }

    fmt.Println(a4)

    //多维数组的遍历

    for _, v1 := range a4 {

        fmt.Println(v1)

        for _, v2 := range v1 {

            fmt.Println(v2)

        }

    }

    for k, v := range foo {

        fmt.Println("map", k, v)

    }

    //数组是值类型

    b1 := [3]int{1, 2, 3}

    b2 := b1 //ctrl+c, ctrl+v

    b2[2] = 100

    fmt.Println(b1, b2)

    //数组支持 ==  != 操作符,因为内存总是被初始化过的

    // [n]*T 表示指针数组, *[n]T表示数组指针

    b3 := [...]int{1, 3, 5, 7, 8}

    var count int = 0

    for _, v := range b3 {

        count += v

    }

    fmt.Println("count==", count)

    valueI := 8

    for i := 0; i < len(b3); i++ {

        for j := i + 1; j < len(b3); j++ {

            if b3[i]+b3[j] == valueI {

                fmt.Printf("(%d,%d)\n", i, j)

            }

        }

    }

    //切片,slice

    //数组的长度是固定的,是类型的一部分,有很多局限性。

    //是一个拥有相同类型元素的可变长度的序列,属于数组类型做的一组封装,非常灵活,自动扩容

    //引用类型,内部结构包含地址,长度,容量,用于快速的操作一块数据集合

    var s1 []int //定义一个存放int类型元素的切片

    var s2 []string

    fmt.Println(s1, s2)

    var c = []bool{false, true}

    var s3 = []int{1, 2, 3}

    var s4 = []string{"沙河", "张江", "平山村"}

    fmt.Println(c, s3, s4, len(s4), cap(s4))

    fmt.Println(s1 == nil, s2 == nil)

    //  s4=append(s4,"hello")

    s5 := [...]int{1, 3, 5, 7, 9, 11, 13}

    s6 := s5[:4] //基于一个数组切割,左闭右开

    fmt.Println(s6)

    fmt.Println(s5[1:], s5[:])

    //切片的容量是指底层数组的容量

    s7 := s5[:5]

    s8 := s5[2:5]

    //切片的容量底层数组从切片的第一个元素到最后的元素数量

    fmt.Printf("len(s7):%d,cap(s7):%d,%v\n", len(s7), cap(s7), s7)

    fmt.Printf("len(s8):%d,cap(s8):%d\n", len(s8), cap(s8))

    //切片再切片

    s9 := s7[4:]

    fmt.Printf("len(s9):%d,cap(s9):%d,%v\n", len(s9), cap(s9), s9)

    s10 := s5[3:]

    s11 := s10[2:]

    fmt.Printf("len(s11):%d,cap(s11):%d,%v\n", len(s11), cap(s11), s11)

    //切片是个引用类型,都指向了底层的具体的一个数组

    s5[6] = 1300 //修改了底层数组的值

    fmt.Println("s10:", s10, "s11", s11)

    fmt.Println("s")

    //make函数创建切片

    

    

}

func arraySum(s [3]int) int {

    sum := 0

    for _, v := range s {

        sum += v

    }

    return sum

}

你可能感兴趣的:(golang)