引言
最近刷抖音听说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
还没有评论,来说点什么吧。