go语言的基础语法(包含运行实例)

68 阅读5分钟

前言:

首先呢,作者本人是一个有关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)  
}

运行结果:

image.png 你会看到,明明是先写的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()

最后:

最后,码字不易,嘴下留情谢谢!