Go学习 Day-01

引言

最近刷抖音听说Go语言是不推荐小白学习的,自认为能力还算可以,想要挑战一下,大概的了解了一下基本语法,感觉和C差不多,又和Python有点类似,赋值那块儿又有点像Delphi,编译速度说是快,目前没有很大的感觉,因为代码量不够,可能真正的做一个项目的时候,才能体现出编译速度吧。

今天的大纲

demo1() // 九九乘法表,基本输出
demo2() // 简单计算器,键盘输入和基本输出
demo3() // 递归法阶乘,主要观察形参和返回值
demo4() // 字符串操作,字符串相关操作
demo5() // 自定义类型(结构体)map键值对的使用
demo6() // 指针简单实例,指针的操作
demo7() // 变量交换,形参的传递,地址相关

代码

package main

import (
    "errors"
    "fmt"
    "strings"
)

func demo1() {
    for i := 1; i <= 9; i++ {
        for j := 1; j <= i; j++ {
            if i == j {
                fmt.Printf("%dx%d=%2d \r\n", i, j, j*i)
            } else {
                fmt.Printf("%dx%d=%2d ", i, j, j*i)
            }

        }
    }
}

func demo2() {
    var a, b int
    var c string
    var r int
    fmt.Println("eg. 1 + 2 Number[Space]Operator[Space]Number")
    fmt.Scanf("%d %s %d\n", &a, &c, &b)
    switch c {
    case "+":
        r = a + b
        break
    case "-":
        r = a - b
        break
    case "*":
        r = a * b
        break
    case "/":
        r = a / b
        break
    default:
        r = 0
        err := errors.New("[!] 未知的运算标识符")
        fmt.Println(err)
        return
    }
    fmt.Printf("%d%s%d=%d", a, c, b, r)

}

func demo3(opts int) (result int) { // 参数名 参数数据类型   )( 返回值变量名  返回值数据类型
    if opts == 0 {
        return 1
    } else {
        return opts * demo3(opts-1)
    }

}

func demo4() {
    var text string = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789"
    var text2 string = "123,456,789,0"
    //字符串操作需要使用strings这个工具类嘛
    fmt.Printf("text=%s\n", text)
    fmt.Println("字符串长度:", len(text))
    fmt.Println("Z的位置", strings.Index(text, "Z"))
    fmt.Println("4的位置", strings.Index(text, "4"))
    fmt.Println("0的位置(不存在)", strings.Index(text, "0"))
    fmt.Println("包含ABC?", strings.Contains(text, "ABC"))
    fmt.Println("索引3-6之间的字符:", string(text[3:6])) // 和Python差不多,但是又不一样
    fmt.Println("text2=", text2)
    split := strings.Split(text2, ",")
    fmt.Println("根据,分割", split)
    for i := 0; i < len(split); i++ {
        fmt.Printf("\tsplit[%d]=%s\n", i, split[i])
    }
}

type person struct {
    name    string
    address string
    age     int
}

func demo5() {
    m := make(map[string]person) // make?
    m["me"] = person{name: "zunmx", age: 23, address: "localhost"}
    m["you"] = person{name: "anonymous", age: 18, address: "earth"}
    fmt.Println(m)
    fmt.Println("有多少个键:", len(m))
    println("遍历")
    for key := range m {
        fmt.Printf("\t姓名:%s\n\t地址:%s\n\t年龄:%d\n\t----------------\n", m[key].name, m[key].address, m[key].age)
    }

}

func demo6() {
    var num *int                           // 和C里面的指针差不多
    fmt.Println("地址:", num, "值:如果获取就会报错的") // 只是声明,却没初始化
    num = new(int)                         // 此时,如果没有new,这个值是赋不上去的
    *num = 123                             // 赋值操作
    fmt.Println("地址:", num, "值:", *num)
}
func swap(a int, b int) {
    c := a
    a = b
    b = c
    fmt.Printf("[swap方法的转换] a=%d b=%d\n", a, b)
}
func swap2(c *int, d *int) {
    e := *c
    *c = *d
    *d = e
    fmt.Printf("[swap方法的转换] c=%d d=%d\n", *c, *d)
}
func demo7() {
    // 查资料 go语言没有引用传递,那么猜测调用swap是没用的
    a := 1
    b := 2
    fmt.Printf("[原始的]a=%d b=%d\n", a, b)
    swap(a, b)
    fmt.Printf("[demo7调用完swap后]a=%d b=%d\n", a, b)
    // 但是如果传递的是地址,那么会不会有影响呢?
    var c *int
    var d *int
    c = new(int)
    d = new(int)
    *c = 1
    *d = 2
    fmt.Printf("[原始的]c=%d d=%d\n", *c, *d)
    swap2(c,d)
    fmt.Printf("[demo7调用完swap2后]c=%d d=%d\n", *c, *d)

}

func main() {
    demo1() // 九九乘法表
    demo2() // 简单计算器
    fmt.Println(demo3(3)) // 递归法阶乘
    demo4() // 字符串操作
    demo5() // 自定义类型,map使用
    demo6() // 指针简单实例,指针的操作
    demo7() // 变量交换,形参的传递
}

疑问&解答

为什么创建map用make?

根据make的注释解释,分配并初始化类型的对象,如果不加make的话,那么往里面填数据的话,就会报错panic: assignment to entry in nil map
make 专门用于创建 chan,map 和 slice 三种类型的内容分配,目前还没有用到chan和slice,也不知道是什么,先记录一下。

在大学时候,学习C语言的时候,创建对象,开辟空间用的是new,那么new map可不可以呢? 虽然在make的说明里明确说了,make专门用于创建... map ... 了,暂时没有能力验证这个问题,先记录一下。

输出map时,Println和fmt.Println差异

根据下面的结果,可以看出来Println和fmt.Println是有区别的

m := make(map[string]int32) // make?
    for i := 'a'; i <= 'f'; i++ {
        m[string(i)] = i
    }
    fmt.Println(m)
    println(m)

map[a:97 b:98 c:99 d:100 e:101 f:102]
0xc0001104b0

猜测:fmt 是不是format的意思?格式化?类似于Java中的toString方法?
看源码:Println是buildIn方法,看不到具体实现
而fmt里面可以看到Println的说明Println formats using the default formats for its operands and writes to standard output.,也就是格式化输出了。
记录一下吧,fmt这个包是干嘛的

记录

引用

记录:chan和slice是什么东西?
记录:new 能不能创建map? 验证
记录:fmt这个包是干嘛的?

评论 0

还没有评论,来说点什么吧。

提交后需要审核才会公开。