Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。与Java有类似的垃圾回收机制、C的执行高效性,而且在处理并发上具有使用简单、快捷等优势。
- 包,变量和函数
1. 变量或者函数名是通过首字母大小写来控制访问权限,以大写字母开头表示可以在外包中导入使用,否则只能在本包中使用。
math.Pi(正确) math.pi(错误)
2. ":="与"var"声明变量的区别,":="只能在函数内使用,而"var"没有这个限制,所以一般用var方式来定义全局变量
var x, y, z = 1, 2, 3
func main() {
x, y, z := 1, 2, 3
}
3. 导入多个包使用小括号包含
import (
"fmt"
"math"
"time"
)
4. 函数以func来定义声明
func add(x int, y int) int {
return x + y
}
5. 函数形参类型相同时,除最后一个类型外,其它都可以省略
func add(x, y int) int {
return x + y
}
6. 函数支持多值返回
func swap(x, y string) (string, string) {
return y, x
}
7. 函数的返回值可以被命名, 它们会视为定义在函数顶部的变量
func add(x, y int) (sum int) {
sum = x + y
return
}
- 流程控制语句(for, if else, switch和defer)
1. 没有while,但是可以使用for代替
sum :=0
for sum < 100 {
sum += 1
}
//无限循环
for {
fmt.Println("...")
}
2. switch...case...中自动提供break,且case无需为常量,取值不必为整数
switch i {
case 0:
case f():
default:
}
3. defer 声明的语句会在函数返回之后执行,同时遵循后进先出原则
扫描二维码关注公众号,回复:
11108260 查看本文章
![](/qrcode.jpg)
fun main() {
fmt.Println("start...")
for i := 0; i<3; i++ {
fmt.Print(i,",")
}
fmt.Println("end...")
}
打印结果为:
start...
end...
2,1,0,
- 方法和接口
1. 方法就是一类带特殊的接收者参数的函数
type Vertex struct {
x, y int
}
func Abs(v Vertex) float64{
fmt.Println("这是一个函数")
return math.Sqrt(v.x*v.x + v.y*v.y)
}
func (v Vertex) Abs(str string) float64 {
fmt.Println("这是一个方法", str)
return math.Sqrt(v.x*v.x + v.y*v.y)
}
2. 指针类似于c
3. 接口使用interface
- 并发
1. 在执行函数前加上"go"表示启动一个新的线程并执行
func say(s string){
for i := 0; i<5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
go say("world")
say("hello")
}
2. 信道是带有类型的管道,使用make进行创建,通过操作符 <- 来发送或者接收值
func sum(s []int, c chan int) {
sum := 0
for _, v := range s {
sum += v
}
c <- sum //将和送入c
}
func main() {
s := {1,2,3,4,5,6}
c := make(chan int, 100) //带缓冲的信道
go sum(s[:3], c)
go sum(s[3:], c)
x, y := <-c, <-c //从c中接收
fmt.Println(x, y, x+y)
}
当信道的缓冲区填满后,向其发送数据时才会阻塞,当缓冲区为空时,接受方会阻塞
3. select是用来监听和channel有关的IO操作,当IO操作发生时,触发相应的操作
select {
case <- chan1: //如果chan1成功读到数据,则进行该case处理语句
case chan2 <- 1: //如果成功向chan2写入数据,则进行该case处理语句
default: //如果上面都没有成功,则进入default处理语句
}