Loading... # 引言 最近刷抖音听说Go语言是不推荐小白学习的,自认为能力还算可以,想要挑战一下,大概的了解了一下基本语法,感觉和C差不多,又和Python有点类似,赋值那块儿又有点像Delphi,编译速度说是快,目前没有很大的感觉,因为代码量不够,可能真正的做一个项目的时候,才能体现出编译速度吧。 # 今天的大纲 demo1() // 九九乘法表,基本输出 demo2() // 简单计算器,键盘输入和基本输出 demo3() // 递归法阶乘,主要观察形参和返回值 demo4() // 字符串操作,字符串相关操作 demo5() // 自定义类型(结构体)map键值对的使用 demo6() // 指针简单实例,指针的操作 demo7() // 变量交换,形参的传递,地址相关 # 代码 ```go 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这个包是干嘛的 # 记录 <div class="tip inlineBlock share"> 记录:chan和slice是什么东西? 记录:new 能不能创建map? 验证 记录:fmt这个包是干嘛的? </div> © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏