var
开头,后跟变量名,再跟类型:var a int
var a,b,c int
var a int = b
var a,c int = x,y,z
var a=1
var a,b = x,y
var
:a:=1
a,b := x,y
(次形式仅限用于函数体)_
。赋值给_
的值会被丢弃。如_,a := 1,2
会把2赋给a,同时1被丢弃iota
作用域内每使用一次会自增,同一行使用时值相同arr:=[]int{}
,arr:=[10]int{1,2}
,arr:=[...]int{1,2,3}
len(arr)
arr:=[...][...]int{[...]int{1},[1]int{2}}
数组切片;引用类型,同一数组的slice指向同一数组;
1. 定义:var s []int
(不指定长度)
1. arr:=[...]int{1,3}
表示数组s:=arr[0:2]
表示从在数组arr从0到2的切片
1. s:=arr[:2]
从0到2
1. s:=arr[1:]
从1到len(arr)
无序;引用类型;
1. 定义:var m map[string]int
或m:=make(map[string]int)
1. 初始化:m:=map[String]int{"a":1,"b":2}
1. 赋值:m["key"]=1
struct的组合即为面向对象中的类
1. struct组合
1. 匿名字段
1. 组合struct同名字段:优先访问外层
type Pair map[string]int
自定义一个类型
const a = 1
if
for
第一行 以func
开头,后跟函数名,然后小括号内参数列表,以{
结尾,然后是函数体,最后以}
结束。
如果需要有返回值,则在参数列表后跟小括号,括号内写返回值类型
func get()(a int,b int){
a=1
b=2
return
// 同return 1,2
}
func get(arg ...int){
for n := range arg{
// process n
}
}
@H_36_301@传值与传指针
*
,而使用时会自动取址和指向(不用写&
或*
)// 定义一种函数类型
type testInt func(int) bool
// 定义该项类型方法
func bigThanZero(v int) bool {
return v > 0
}
// 定义该项类型方法
func smallThanZero(v int) bool {
return v < 0
}
// 方法作为参数
func process(v int,f testInt) bool {
a := 0
return f(a)
}
func main() {
a := 0
// 方法作为变量
process(a,bigThanZero)
}
带接收者的函数
// r为变量名,Receiver为接收者类型
func (r Reciever) f(){ }
声明方法时,指定新的接受者即可
@H_962_403@interface// 定义接口I
type I interface{
fun1()
fun2(arg string)
}
同Java
同Java
类似java中instanceof
func main() {
m := map[string]Thing{"key": O{"a"}}
// m["key"].(Thing)类似java中m.get("key") instanceof Thing
if value,ok := m["key"].(Thing); ok {
value.create()
}
}
type Thing interface {
create()
}
type O struct {
name string
}
func (o O) create() {
o.name = "1"
}
也支持switch-case
func main() {
m := map[string]Thing{"key": O{"a"}}
// m["key"].(Thing)类似java中m.get("key") instanceof Thing
if value,ok := m["key"].(Thing); ok {
value.create()
}
switch m["key"].(type) {
case Thing:
// process
case O:
//process
}
}
type Thing interface {
create()
}
type O struct {
name string
}
func (o O) create() {
o.name = "1"
}
类似struct的继承,或者叫组合
type i interface{ anotherInterfacce }
import "fmt"
import "os"
const i=100
const pi=3.14
const pre = "go"
var i int
var pi float
var pre string
可改写为
import(
"fmt"
"os"
)
const(
i=100
pi=3.14
pre="go"
)
var(
i int
pi float
pre string
)
func f(){
file.Open("file");
defer file.Close();
// process
}
go run()
主动让出cpu
runtime.Gosched()
c:=make(chan int)
c <- 2
i := <- c
cc := make(chan int,2)
close(c)
v,ok := <-c
select之于channel,类似switch之于int
并发控制
//在if逻辑块内,允许声明一个变量,作用域只在块内有效
if x:= get(); x>10{
}
make返回值,new返回指针
可用于goto
、break
、continue
m:=map[string]int{"a":1}
for k,v:=range m{
// process k,v
}
for _,v:=range m{
// process v
}
不用手写break
自动结束case
如需强制执行下一个case,则需在当前case最后加上fallthrogh
switch i{
case 1:
case 2,3:
}