零基础学Go用一顿饭的时间掌握核心语法传说Go的语法简洁到“你看着代码就能猜出它的意思”。今天我们就用最少的术语最快的方式把Go的基础语法走一遍。阅读时间约15分钟含动手敲代码读者对象有一点编程基础知道变量、循环、函数是什么但没写过Go的同学一、开篇一个完整的Go程序长什么样让我们从经典的“Hello World”开始packagemainimportfmtfuncmain(){fmt.Println(Hello, Go!)}看到什么特点了没有分号结尾编译器会自动加你不需要操心main函数没有返回值左大括号{必须和函数名在同一行否则编译错误——Go有强制代码风格运行它go run main.go如果你来自C/C/Java最大的不同是类型后置、包强制管理、简洁到没有while关键字。二、变量声明Go让你“反过来写”标准写法显式类型varnamestring张三varageint18类型推断让编译器猜常用varname张三// 自动推断为stringvarage18// 自动推断为int短变量声明最常用只能在函数内用name:张三// 等价于 var name 张三age:18这是Go程序员写代码的主流方式。冒号等号:代表“声明并赋值”。多变量声明varx,yint1,2a,b:hello,true常量不可修改constPi3.14159const(StatusOK200NotFound404)三、基本数据类型够用就行类型说明例子bool布尔true/falsestring字符串helloint,int8,int64整数42float32,float64浮点数3.14byte字节等同于uint8AruneUnicode码点等同于int32中varisOKbooltruevarscorefloat6495.5varchbyteA四、控制结构少即是多条件判断if不需要括号age:20ifage18{fmt.Println(成年了)}else{fmt.Println(未成年)}神奇写法if前面可以加一个简单语句ifage:20;age18{fmt.Println(成年了)}// age 在这里就失效了作用域只在if块内循环只有for没有while和do-whileGo的设计哲学一种写法就够了。// 类似C的forfori:0;i5;i{fmt.Println(i)}// 充当whilesum:1forsum100{sumsum}// 无限循环for{fmt.Println(跑不停)break}switch默认不穿透day:Tuesdayswitchday{caseMonday:fmt.Println(周一)caseTuesday:fmt.Println(周二)default:fmt.Println(其他)}注意每个case后面不需要写break执行完会自动跳出。想穿透用fallthrough。五、函数可以返回多个值基本函数funcadd(xint,yint)int{returnxy}参数类型相同时可以简写func add(x, y int) int多返回值Go的特色funcdivide(a,bint)(int,error){ifb0{return0,fmt.Errorf(除数不能为0)}returna/b,nil}// 调用result,err:divide(10,2)iferr!nil{fmt.Println(出错:,err)}else{fmt.Println(结果:,result)}这种(结果, 错误)的模式在Go标准库中随处可见。命名返回值funcgetCoordinates()(x,yint){x10y20return// 裸返回返回x和y}六、数组 vs 切片重点难点数组固定长度不太常用vararr[3]int[3]int{1,2,3}arr[0]100fmt.Println(len(arr))// 3切片动态数组天天用// 创建切片s:[]int{1,2,3}sappend(s,4)// 追加元素fmt.Println(s)// [1 2 3 4]// 用make创建s2:make([]int,5)// 长度5容量5s3:make([]int,3,5)// 长度3容量5切片的切片numbers:[]int{0,1,2,3,4,5}sub:numbers[1:4]// [1,2,3] 从索引1到4不含4数组用的少切片才是真正的王者。记住append、len、cap是切片的三大常用操作。七、map字典/哈希表// 声明并初始化scores:map[string]int{张三:95,李四:87,}// 添加或修改scores[王五]92// 读取fmt.Println(scores[张三])// 95// 判断key是否存在value,ok:scores[赵六]ifok{fmt.Println(找到:,value)}else{fmt.Println(不存在)}// 删除delete(scores,李四)八、指针有但没那么可怕Go有指针但不支持指针算术不能p安全很多。x:42p:x// p是指向x的指针fmt.Println(*p)// 42解引用*p100fmt.Println(x)// 100主要用于让函数修改外部变量避免大结构体拷贝九、结构体Go的“类”但没有继承typePersonstruct{NamestringAgeint}// 创建实例p1:Person{张三,18}p2:Person{Name:李四,Age:20}// 访问字段fmt.Println(p1.Name)// 为结构体添加方法注意这里是函数外面写的func(p Person)SayHello(){fmt.Printf(我是%s今年%d岁\n,p.Name,p.Age)}// 指针接收者可修改func(p*Person)SetAge(newAgeint){p.AgenewAge}调用方法p1.SayHello()p1.SetAge(19)十、一个综合小例子学生成绩管理系统片段packagemainimportfmttypeStudentstruct{NamestringScores[]int}func(s Student)Average()float64{total:0for_,score:ranges.Scores{totalscore}returnfloat64(total)/float64(len(s.Scores))}funcmain(){stu:Student{Name:小明,Scores:[]int{88,92,79,100},}fmt.Printf(%s的平均分是: %.2f\n,stu.Name,stu.Average())}运行输出小明的平均分是: 89.75写在最后Go语法的“哲学”你可能会觉得奇怪为什么只有for没有while为什么if不用括号为什么类型写在变量名后面因为Go的设计者坚信少就是多显式优于隐式规约大于配置。学了上面这些变量、循环、分支、函数、切片、map、结构体你已经能用Go写绝大多数程序了。剩下20%的进阶内容接口、并发、包管理、错误处理可以边做项目边学。下一步建议用Go写一个命令行计算器或者一个简单的HTTP服务。代码量不到50行你会爱上这种感觉。现在打开终端输入go run试试吧