package main
import (
"fmt"
)
func main(){
fmt.Println("Hello World")
}
Go的规定
- 对于导出的变量或其他,必须以大写字母开头,如:math.Pi 合法,math.pi不合法
- Go中使用是:类型在变量名后面
- 函数可以有多个返回值
func swap(x,y string) (string,string){ return y,x }
- 可以通过命名进行返回值返回
func split(sum int) (x,y int){ x = sum * 3 y = sum - 2 return }
- 变量
var一般出现在包级别,函数级别 go有类型推断, var i,j = 1,2.0 短赋值语句隐式确定类型 a := 1 go允许不初始化,不初始化的会被赋予0值 go中不允许隐式转换,强制显示转换 i:= float64(32) 常量使用const关键字
- for(go中没有while)
for i:=0;i<10;i++{ to do sth just you like } 在go中,常用for{}表示无限循环
- if很类似,也是无需小括号
- switch
go的switch中可以有default: go中默认break,如果想要贯穿,需要fallthrough(这点和其他编程语言十分不同) go 中case的取值也十分随意
- defer推迟函数
go中特别好用的一个东西,会在return之后执行defer的代码
- 指针
go中提供指针 var p *int i := 1 p = &i *p 底层值
- struct
type Example struct{ X int Y int } 在go中尽管我们定义一个指针,但是在使用时不需要p->X,直接p.X就行 go中属于隐式解引用 并且fmt.Print(p)也不会打印地址,而是打印出p的解引用的值
- 数组 num [n]T
- 切片 num []T 这个会py的可以笑了,这切片太好用了numpy狂喜
num[1:4] 左开右闭 bool_arr := [3]bool{true,true,true} struct_arr := 切片的零值是nil 用make创建切片 a := make([]int ,5) //len(a)=5 b := make([]int ,0,5) //len(b)=0 cap(b)=5 append(b,2)
- range遍历
for i,v :=range 切片数组{ //添加操作 }
- map m := map[string]int{ “a”: 1 } elem = m[“a”] delete(a,1) elem,ok := m[“a”]
- 函数也是值
经典lambda: result := func(x,y int) int{ return x*y } 经典闭包: func adder() func(int) int { sum := 0 return func(x int)int{ sum += x return sum } }
- 震惊,go中没有类
不过你可以为类型定义方法 func (v *Vertex) Scale(f float64) { v.X = v.X * f v.Y = v.Y * f } 调用: v.Scale(f) func (v Vertex) Scale(f float64) { v.X = v.X * f v.Y = v.Y * f } 注意上面两个函数完全不同,一个是副本传递,一个是引用传递
- 方法与指针重定向
//这里有一个比较逆天的东西,需要好好解决一下
- 接口
type Abser interface{ Abs() float64 }
- 隐式接口
type I interface { M() } func (t T) M() { fmt.Println(t.S) }
-
接口值
- 底层为nil的接口值
func (t *T) M() { if t == nil { fmt.Println(“
") return } fmt.Println(t.S) } -
空接口
- 类型断定
t,ok := i.(T)
- 类型选择
switch v:=i.(type){ case T: case S: }
-
Stringer
- error