我们学习Go语言就像我们学习Java、Python语言那样,首先要了解这门语言的特点、基础语法、函数。
一.Go语言概念及特点
Go语言是谷歌2009发布的第二款开源编程语言。Go语言专门针对多系统应用程序应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。Go语言的特点是高性能、高并发,语法简单,拥有丰富的标准库,完善的工具链,静态链接,支持快速编译,跨平台,垃圾回收机制。
二.Go基础语法
Go语言是强类型语言,它有自己的变量类型,常见的有:整数、字符串、浮点型、布尔类型、指针等。其中字符串是内置类型,一般通过加号直接拼接,也能用等于号比较两个字符串。下面展示一些变量的声明及定义。
var name string // 使用var声明
var name string = "name" //声明并赋初值
var name = "name" //自动推导类型为string
name := "name" //也可以省略var 和类型直接自动推导
Go语言的if-else分支结构与其他语言差不多,只是if、else if后语句不跟圆括号。有的问题需要注意一下。
package main
import (
"fmt"
)
//if-else
if true{
//需要在花括号之中
fmt.Println("That’s right")
}else{
fmt.Println("This is Wrong")
}
// if - else if-else
if true{
fmt.Println("That’s right")
}else if true{
fmt.Println("That’s right")
}else{
fmt.Println("This is Wrong")
}
分支结构出了if-else和if-else if-else,还有switch-case,在switch中可以存放常量、变量、字符串、表达式。
package main
import (
"fmt"
)
switch v{
case 1 , 2 : //并列使用,然后没有break
case 3:
default:
}
switch {
case retInt() == v: //表达式
...
case v == 2:
...
default:
...
}
Go语言的循环结构并不像Java语言那样,有for循环和while循环,它只有for循环语句。
for{ //死循环,不会跳出,相当于while(true)
...
}
for i < 20 { // 类似while(i < 20)
...
}
for i:=0; i < 20; i++{ //正常for循环,i为0,当i<20,执行for循环,执行完后i加1
...
}
数组是长度确定且具有编号的元素序列
var a[10] int //声明一个长度为10的int型数组
b := [5]int{1,2,3,4,5} //声明并定义
c := []int{1,2,3,4,5}//前面长度可以省略根据后面初始化的数量赋值
var twoD [2][3]int// 声明一个二维数组
在Go语言中一般很少使用数组,更多的是使用切片,因为切片不像数组一样事先确定好长度,它可以进行更改长度。现在解释一下为什么s = append(s, “a”)还需要在重新给s赋值呢,虽然切片可以动态变长,其实切片底层是维护了一个数组的,也就是说他初始上就是个数组,只不过有一定大小,如果你append添加元素没有超过数组,那没事,但是超过数组大小,他就会重新弄一个更大的数组然后把值拷贝进去,最后把地址返回出来,所以你得让他重新等于s。
//创建一个切片,初始长度是3
//方法一
s := make([]string, 3)
s[0] = "a"
s[1] = "b"
s[2] = "c"
s = append(s, "d") //向该切片醉驾元素d,数组中不可用
fmt.Println(s) //[a b 3 d]
//方法二
var s []string
s = append(s, "a")
s = append(s, "b")
fmt.Println(s) //[a b]
map用法和其他语言的hashmap和字典类似。
a := make(map[string]int , 3) //key是string value是int 初始大小设置为3
a["name"] = 2
fmt.Println(m["name"])
delete(a , "name") //在a中删除key为name的
下面来介绍range。对于一个 切片或者一个 map 的话,我们可以用 range 来快速遍历,这样代码能够更加简洁。 range 遍历的时候,对于数组会返回两个值,第一个是索引,第二个是对应位置的值。(如果我们不需要索引的话,我们可以用下划线来忽略)
nums := []int{1, 2, 3}
sum := 0
for i, num := range nums { //返回数组的下标和值
sum += num
if num == 2 {
fmt.Println("index:", i, "num:", num) //index:0 num: 2
}
}
fmt.Println(sum) //sum:9
m := map[string]string{"a": "A", "b": "B"}
for k, v := range m { //返回key和value
fmt.Println(k, v) // a A; b B
}
for k := range m { //返回key
fmt.Println("key", k) // key a; key b
}
这个是 Go 里面一个简单的实现两个变量相加的函数。 Go 和其他很多语言不一样的是,变量类型是后置的。Go 里面的函数原生支持返回多个值。在实际的业务逻辑代码里面几乎所有的函数都返回两个值,第一个是真正的返回结果,第二个值是一个错误信息。
func add(a int , b int) int ,err {//a int , b int == a , b int俩种方式都一样
return a + b
}
func add(a , b int)(int , error){ //可返回多个值
return a + b , nil
}
func Tmp(a , b int){
func() int {//还可以在函数内部定义一个匿名函数,类似别的语言lambda函数
return 5
}()//加上()表示直接调用
}
结构体和结构体函数,相比其他语言,结构体成员函数是在外面定义的。
type student struct { //定义方式type+结构体名+struct
name string //小写变量名相当于私有,只有自己包的才可以访问
Age int //大写变量名相当于公有,外面包也可以访问
}
//为成员变量赋值
stus := []student{
{name: "小明", Age: 18},
{name: "小红", Age: 21},
{name: "小李", Age: 23},
}
type person struct {
name, city string
age int8
}
// (接收者变量 接收者类型) 方法名(参数列表) (返回参数)
// 不可修改成员的值
// 方法与函数的区别是,函数不属于任何类型,方法属于特定的类型。
func (p person) Dream() {
fmt.Printf("%s的梦想是学好Go语言!\n", p.name)
}
// 可修改成员的值
func (p *person) SetAge(newAge int8) {
p.age = newAge
}
三.总结
关于Go语言基础语法,主要介绍了变量、分支结构(if-else和switch)、循环结构、数组、切片、map、range、函数、结构体、结构体函数,其中要注意的是切片、结构体、结构体函数。因为这部分与别的语言有不同的点,也体现了Go语言独特的优势。