# Go语法基础

1. 包、入口、main

go 复制代码
package main   // main包,可执行程序

import "fmt"    //导入包

func main() {   //程序入口,无参数无返回
	fmt.Println("hello go")
}
  • package main:生成可执行文件;其他包是库。
  • main函数不能传参、没有返回值。

编译运行:

bash 复制代码
go run main.go
go build -o app main.go

2. 变量、常量

go 复制代码
// 声明
var a int
var b int = 10
c := 20   //短变量,只能函数内部使用,自动推导类型

//多变量
var x,y int = 1,2

//常量
const pi = 3.14

:= 不能写在函数外面。

类型:int int64 string bool float64

3. 基本类型转换

Go不隐式转换,必须显式转换

go 复制代码
var a int = 10
var b int64 = int64(a)

string和数字转换用 strconv 包。

4. if for (没有while)

go 复制代码
// if,条件不用括号
if a > 10 {

} else if a <5 {

}else{

}

// for,唯一循环
for i:=0;i<5;i++{
	fmt.Println(i)
}

// 等价while
for a>0 {
	a--
}

// range遍历数组、slice、map
arr := []int{11,22,33}
for idx,val := range arr {
	fmt.Println(idx,val)
}

5. 函数

go 复制代码
func add(a int,b int) int{
	return a+b
}

//多返回值(Go高频,经常返回(结果,err))
func div(a,b int) (int,error){
	if b ==0{
		return 0,fmt.Errorf("div zero")
	}
	return a/b,nil
}

调用:

go 复制代码
res,err := div(10,0)
if err != nil {
	//处理错误
}

Go没有异常机制,用error返回错误,不抛异常。

6. slice切片(最常用,动态数组)

go 复制代码
//初始化
s := []int{1,2,3}
s2 := make([]int,0,10) //长度0,容量10

//追加
s = append(s,4)

//切片截取 s[low:high]
sub := s[1:3]

slice底层共享数组,修改会互相影响。

7. map

go 复制代码
//map必须make初始化,直接var声明是nil,不能存数据
m := make(map[string]int)
m["a"] = 10

//读取,ok判断key是否存在
val,ok := m["b"]
if ok {
	fmt.Println(val)
}

delete(m,"a") //删除key

8. struct结构体

go 复制代码
type User struct {
	Name string
	Age  int
}

func main(){
	u := User{Name:"zhangsan",Age:20}
	fmt.Println(u.Name)
}

方法(绑定struct)

go 复制代码
func (u *User) SetAge(age int){ //指针接收者,修改结构体
	u.Age = age
}

指针接收者:需要修改结构体内容;值接收者只拷贝只读。

9. 指针

*取值,&取地址

go 复制代码
a := 10
p := &a
fmt.Println(*p)

10. 并发:goroutine + channel(Go灵魂,面试必问)

goroutine:轻量级协程,go关键字启动

go 复制代码
func hello(){
	fmt.Println("goroutine")
}

func main(){
	go hello() //开启协程
	time.Sleep(time.Second)
}

channel协程通信:

go 复制代码
ch := make(chan int)
go func(){
	ch <- 100 //写channel
}()
v := <- ch //读channel
fmt.Println(v)

11. defer 延迟执行

函数退出前执行,常用于关闭文件、关闭资源

go 复制代码
func test(){
	f,err := os.Open("test.txt")
	if err!=nil{
		return
	}
	defer f.Close() //函数返回前自动关闭
}

12. 错误处理核心考点

  1. Go没有try‑catch;
  2. 函数多返回值,把error作为返回;
  3. nil代表无错误;
  4. fmt.Errorf("xxx")构造错误。

面试简答高频问题

  1. slice和array区别?

    array长度固定;slice是动态切片,底层指向数组。make创建slice。

  2. map为什么一定要make?

    var得到nil map,未初始化,写入直接panic。

  3. goroutine和线程区别?

    goroutine用户态轻量级,栈小,go调度器管理;OS线程内核态,开销大。

  4. defer执行时机?

    当前函数return之前执行。

  5. 值接收者 vs 指针接收者?

    指针:修改原结构体,拷贝小;值接收者拷贝一份副本。

一段极简完整示例(读取文件)

go 复制代码
package main

import (
	"fmt"
	"os"
)

func main() {
	data, err := os.ReadFile("/etc/hosts")
	if err != nil {
		fmt.Println("read err:", err)
		return
	}
	fmt.Println(string(data))
}
相关推荐
喵个咪5 小时前
GoWind Kanban 拆解:看板拖拽背后——LexoRank、乐观锁与尽力而为广播
后端·架构·go
喵个咪5 小时前
GoWind OA 拆解:用 3000 行 Go 写一个够用的审批工作流引擎
后端·架构·go
喵个咪5 小时前
GoWind Ledger 拆解:单式记账的余额一致性——confirm、补偿,以及没进事务的那些缝隙
后端·架构·go
喵个咪5 小时前
GoWind Shop 拆解:订单超时关单——一个事务里的四联动
后端·架构·go
喵个咪5 小时前
GoWind ERP 拆解:一个 ERP 里的三种一致性等级
后端·架构·go
喵个咪8 小时前
GoWind CMS 拆解:在 Go 里给 TipTap 搭一套 Yjs 协同后端
后端·go·cms
喵个咪8 小时前
GoWind Admin 拆解:一个 Sender 接口接 39 个通知渠道
后端·架构·go
喵个咪8 小时前
GoWind CMS 拆解:社交分发引擎——10 平台适配器、状态闸门与自愈定时任务
后端·go·cms
喵个咪8 小时前
GoWind UBA 拆解:把 Doris UNIQUE KEY 翻译成 ClickHouse——读数正确性对齐实录
大数据·后端·go
喵个咪10 小时前
GoWind ShortPlay 拆解:Ent privacy/viewer 多租户隔离——从中间件到 SQL 的零信任链
后端·架构·go