Go 语言入门指南:基础语法和常用特性解析|青训营

224 阅读5分钟

我们学习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语言独特的优势。