go语言
特点:
- 高性能、高并发;
- 语法简单、学习曲线平缓;
- 丰富的标准库;
- 完善的工具链;
- 静态链接;
- 快速编译;
- 跨平台;
- 垃圾回收;
基础语法:
1.输出“hellloworld”
package main
import (
"fmt"
)
func main() {
fmt.Println("hello world")
}
由上面的代码,我们不难看出在go程序中一行代表一个语句的结束,与python相像
2.字符串的连接
Go 语言的字符串连接可以通过 + 实现:
package main
import "fmt"
func main() {
fmt.Println("Hello" + "World")
}
并且允许使用等于来比较两个字符串
变量
变量的声明(两种)-----可以同时声明多个变量:
方法一:使用var来声明变量: var 变量名,...= 值 或var 变量名,... 类型 = 值,... ;其中第一种方式会自动确定类型
var a="HelloWorld"
var b,c int = 1,2
方法二:使用:=声明变量 变量名,... := 值,...,同样这种方式也是能够自动确定类型
a,b,c := 1,"hello",true
常量
常量的定义方式就是将变量定义方法中的var改为const即可,常量会根据上下文自动确定类型:
-
显式类型定义:
const a string = "abc" -
隐式类型定义:
const a = "abc"
const a int = 10
const a = 5
const a, b, c = 1, false, "str" //多重赋值
条件语句:if else
go语言的if语句中if后是没有括号的,这点与c++和java不同;
package main
import "fmt"
if a>b {
fmt.Println("a>b")
}else{
fmt.Println("a<b")
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语言中只有for循环,没有while等循环;go语言支持break、continue和goto三种循环控制语句;
for j := 7; j < 9; j++ {
fmt.Println(j)
}
for n := 0; n < 5; n++ {
if n%2 == 0 {
continue
}
fmt.Println(n)
}
数组
不同于变量和常量的声明方法,在go语言中数组的声明需要指定元素类型和元素个数:
var 数组名 [数组大小]数据类型或数组名 := [大小]数据类型
同时我们可以使用初始化列表来初始化数组的元素
例:
var numbers [5]int
var numbers = [5]int{1, 2, 3, 4, 5}
numbers := [5]int{1, 2, 3, 4, 5}
切片;
我们也可以理解为动态数组,长度是不固定的,可以追加元素; 我们可以使用make()函数来创建切片,利用copy()函数拷贝切片;用append()函数来追加新元素; go语言中有与python相同的切片如s[2:5]选中的是2到5的元素,包含2但不包含5
例如:
s := make([]string, 3)
s[0] = "a"
s[1] = "b"
s[2] = "c"
c := make([]string, len(s))
copy(c, s) //将s切片中的元素拷贝到c中
fmt.Println(c)// a,b,c,d,e,f
fmt.Println(c[2:5])// c,d,e,f;打印从2(包含)到5(不包含)的元素
s = append(s, "d")//追加d
s = append(s, "e", "f")//追加e和f
MAP(集合)
与切片你相同我们使用内建函数 make 或使用 map 关键字来定义 Map:
// 创建一个空的 Map
m := make(map[string]int)
// 创建一个初始容量为 10 的 Map
m := make(map[string]int, 10)
// 获取键值对
v1 := m["apple"]
v2, ok := m["pear"] // 如果键不存在,ok 的值为 false,v2 的值为该类型的零值
//方法1:
m := make(map[string]int)
m["one"] = 1
m["two"] = 2
//方法2:
m2 := map[string]int{"one": 1, "two": 2}
//方法3:
var m3 = map[string]int{"one": 1, "two": 2}
Range关键字
用于 for 循环中迭代数组、切片、通道或集合的元素,下面的代码是使用rang关键字来遍历一个map集合:
m := map[string]string{"a": "A", "b": "B"}
for k, v := range m {
fmt.Println(k, v) // b 8; a A
}
for k := range m {
fmt.Println("key", k) // key a; key b
}
for _,v :=range m{
fmt.Println(v) //A;B
}
从上方的代码中我们可以看出在遍历集合时“k”和“v”都是可以省略的可以使用下划线来代替k,v可以不使用;如果只有一个变量那只会显示键不显示键值;
函数
函数的使用与python等语言相差不大,都是定义函数后调用,没什么好说的;
指针
func add2ptr(n *int) {
*n += 2
}
n := 10
add2ptr(&n)
fmt.Println(n)
结构体
结构体定义需要使用 type 和 struct 语句。struct 语句定义一个新的数据类型,结构体中有一个或多个成员。type 语句设定了结构体的名称。如下:
type user struct {
name string
password string
}
如果不进行初始化,字符串就是空值,数字类型是0; 我们使用".+字段名"的方式来读取或修改值; 结构体能作为函数的参数(指针/非指针)使用;若使用指针能避免一些大结构体的开箱,同时能实现对结构体的修改;
结构体方法: 与作为函数参数时一样,可以是用指针或非指针的方式来实现;同样的使用指针能实现对结构体的修改;下面是两个方法示例:
func (u user) checkPassword(password string) bool {
return u.password == password
}
func (u *user) resetPassword(password string) {
u.password = password
}
错误处理(error)
go语言错误处理机制十分的简单,可以在函数的返回值中加入error,在主函数调用时需要定义两个变量,