一篇搞懂Go入门基础

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 声明的语句会在函数返回之后执行,同时遵循后进先出原则

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处理语句
}

 

你可能感兴趣的:(Go)