前言:
首先呢,作者本人是一个有关go语言的初学者,有些代码细节可能还是理解不到位,如有错误之处欢迎大家指出,当然作者希望大家不喜勿喷,嘴上多多留情哈,谢谢!
那么接下来我就不废话了,我本人呢,学习go用的编译器是goland(这里小小的吐槽一下:这个编译器感觉不太聪明的样子)下面是正文哈
一,变量
首先是变量的声明,关于这一点呢,在c或c++中老版的语言系统里,我们一般都会写int a = 0,但是在go语言里面,它的语法规则是不需要给变量声明类型,他会用var根据你给他赋的值来对他进行类型的判定。
当然如果你实在是闲的没事干非要写类型名的话,也可以像下面这样写。
var a int
a = 10
var b int = 10
那么一般呢,我们对变量进行声明赋值的操作,大体如下:
var a = "initial"
var b, c int = 1, 2
var d = true
var e float64
f := float32(e)
g := a + "foo"
fmt.Println(a, b, c, d, e, f)
fmt.Println(g)
const s string = "constant"
const h = 5000000000
const i = 3e20 / h
fmt.Println(s, h, i, math.Sin(h), math.Sin(i))
在这段代码中呢,我们可以看到像var e float64 这一行来说,就连var都不需要,但是请注意在赋值时要在=前加上:,我们所书写的类型名呢,也是后置于变量声明的。
二,if else语句
在go语言的语法规范里呢,if语句是不再需要小括号来做范围判断了,而且在if后面还可以直接对变量进行参数修改和创建,只能说更方便了。
if 7%2 == 0 {
fmt.Println("7 is even")
} else {
fmt.Println("7 is odd")
}
if num := 9; num < 0 {
fmt.Println(num, "is negative")
} else if num < 10 {
fmt.Println(num, "has 1 digit")
} else {
fmt.Println(num, "has multiple digits")
}
三,循环
在go语言里,没有while循环,只有for循环,当然和if一样,没有括号(好开心,可以少敲两下代码)。
for j := 7; j < 9; j++ {
fmt.Print(j, " ")
}
for n := 0; n < 5; n++ {
if n%2 == 0 {
continue
}
fmt.Print(n, " ")
}
i := 1
for i <= 3 {
fmt.Print(i, " ")
i = i + 1
}
四,stwitch语句
和c,c++作比较的话,不能说比较相似,只能说一模一样。
a1 := 2
switch a1 {
case 1:
fmt.Println("one")
case 4, 5:
fmt.Println("four or five")
default:
fmt.Println("other")
}
五,数组
go语言里的数组,怎么说呢,完美的继承了他自己的变量声明形式,变量类型写在变量名后边。
b := [5]int{1, 2, 3, 4, 5}
fmt.Println(b)
var twoD [2][3]int
for i := 0; i < 2; i++ {
for j := 0; j < 3; j++ {
twoD[i][j] = i + j
}
}
六,切片
切片咱们就得好好唠一唠了,毕竟c语言和c++里边没有它。
这个切片呢,一般是有以下几种声明形式:
s1 := make([]string, 3)
s1[0] = "a"
s1[1] = "b"
s1[2] = "c"
c1 := make([]string, len(s1))
copy(c1, s1)
good := []string{"g", "o", "o", "d"}
有关切片呢,大家可以把它理解成一种特殊的字符型数组,它是由make函数所构建的一种类型变量(虽然直到现在我也没感觉出来它有什么用),但是我相信它后面一定会很有用(狗头保命)
有的时候我们会见到有人会这样调用切片,这个意思呢就是对s1进行从下标2到下标5的所有字符进行输出,当然包含下标2的字符而不包含下标5的字符。
fmt.Println(s1[2:5])
七,map
map,俗称映射,就是一种简单的k-v配对,即前者下标对后者值一一对应,你可以理解为一种特殊的数组,特殊在于他的下标并不是常规的整型数字,而可以是字符串类型等等。
m2 := map[string]int{"one": 1, "two": 2}
delete(m2, "one")
当然,map在建立后也可以对下标进行delete删除,删除后map对象就不再拥有"one"下标所对应的值了。
八,range
range就是按顺序遍历输出,直接看代码及运行结果,我想你会明白:
var m3 = map[string]int{"three": 3, "four": 4, "five": 5, "six": 6}
fmt.Println(m3)
for k, v := range m3 {
fmt.Println(k, v)
}
运行结果:
你会看到,明明是先写的3,但是在Println打印时却先写出了5!这是因为Println在对map进行打印时是根据下标的首字母以26字母顺序进行排列(我目前已知是这样,也有可能是ASKII码)
但是当你用range遍历打印时,他就会按照你赋值的顺序来进行打印。
九,函数
函数这里没什么大的不同,就是返回值可以实现多个值进行返回。而关于变量类型放在变量之后这样的废话我就实在是不想再说了。
func exists(m map[string]string, k string) (v string, ok bool) {
v, ok = m[k]
return v, ok
}
十,指针
和c,c++一样。写法也就是变量类型放在变量之后这样。
十一,结构体
首先是结构体的定义声明:
type user struct {
name string
password string
}
这是初始化的写法:
a := user{name: "张三", password: "123456"}
十二,字符串操作
烦人的来了。这个go语言对字符串还真是情有独钟,连有关函数都多的数不清,我这里呢举几个常用的介绍下:
a := "hello"
fmt.Println(strings.Contains(a, "ll")) //查找字符串中是否存在后者,返回bool类型
fmt.Println(strings.Count(a, "l")) //查找字符串中有几个后者字符,返回int类型
fmt.Println(strings.HasPrefix(a, "he"))//对标字符串头部是否与对标字符串相同
fmt.Println(strings.HasSuffix(a, "llo"))//对标字符串尾部是否与对标字符串相同
fmt.Println(strings.Index(a, "ll"))//返回子串str在字符串s中第一次出现的位置
fmt.Println(strings.Join([]string{"he", "llo"}, "-"))//将两段字符串以"-"符号相连接
fmt.Println(strings.Repeat(a, 2))//将字符串重复2遍输出
fmt.Println(strings.Replace(a, "e", "E", -1))//对单一字符类型进行大小写转化
fmt.Println(strings.Split("a-b-c", "-"))//去掉"-"符号换成空格
fmt.Println(strings.ToLower(a))//字符串改小写
fmt.Println(strings.ToUpper(a))//字符串改大写
十三,时间
time.Now函数就是直接读取系统当前时间的函数。
now := time.Now()
最后:
最后,码字不易,嘴下留情谢谢!