跳到主要内容

1.1-语言基础语法

Create by fall on 02 Mar 2023 Recently revised in 11 Feb 2025

Go

安装

下载

语法

从 hello world 开始

// main.go
package main
import (
"fmt"
)
func main() {
fmt.Println("Hello world")
}
// 定义变量
func foo(){
// 有初始值
a := 54
var b = 211
// 无初始值
var c int
c = 10
const mouse = 1 // const 只能声明简单类型
// 如果不进行初始化,会有一些默认值
var i int // 0
var f float64 // 0
var b bool // false
var s string // ""

x := i + 7 // 7
y := !b // true
z := s + "string" // string
}
// 顶级作用域,必须要使用 var 进行定义
var mvp = 2323

类型

// 整数类型
int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr
byte // uint 8 别名
rune // int32 别名

// 浮点数类型
float32 、float64
// 复数类型
complex64
complex128
// bool
bool
// 字符串类型
string

使用 Printf 输出不同的类型

// fmt.Printf()
// %T 可以输出对应类型,比如
func main(){
c := false
fmt.Printf("c 的类型为 %T",c)
}

运算符

和其他语言基本保持一致

// + - * /
// % < > <= >= ==
// && ||
// += -= i++ i--

逻辑语句

判断

func main(){
a :=10
if a> 10{

}else if m:=55; a >2{ // 可以初始变量,只在括号内可用

}else {

}
}

循环

func main (){
for i :=1 ;i<5;i++ {
fmt.Println("dididi, %d", i)
}
var j = 1
for j<5 {
fmt.Println("dsa")
j++
}
}

函数声明

func sum(a int,b int)int{
return a + b
}
// 交换参数位置
func swap(a,b int)(int,int){
return b,a
}
func sum(a int,b int, transform func(init) int){
return transform(a),transform(b)
}

数组

func main(){
// 固定长度数组
a := [5]int{1,2,3,4,5}
// 可变长度数组,也叫切片,slice
a := make([]int,0) // 等价于 a := []int{1,2,3,4,5}
a = append(a,1,1,2,3) // 向 a 中插入数据
// 切片
c := [6]int{1,2,3,4,5,6}
d := c[1:4] // [2 3 4]
// 获取切片长度
len(c) // 3
// 容量
cap(c) // 6
}

Map

func main(){
// 定义一个 Map
m := map[string]int{
"a":1,
"b":3,
}
fmt.Println(m)
}

结构

type Point struct{
X int
Y int
}
// & 表示对应数据的指针地址,* 表示地址中的数据
func (p *Point) SetPoint(x , y int){
p.X = x
p.Y = y
}
type Person struct {
name string // ""
age int // 0
}
p := Person{} // Creates a Person with empty string name and age 0
func main (){
p := Point{1,2}
fmt.Println(p)
p.SetPoint(2,3)
p.X = 5
}

指针

在 go 中,几乎一切赋值的内容都是对应的值,slices, maps, channels 除外

type Point struct{
X int
Y int
}
func main (){
p := Point{1,2}
fmt.Println(p)
q := p
q.X = 5
// 此时赋值,两者不会干扰(默认按值赋值)
fmt.Println(q) // 5,2
fmt.Println(p) // 1,2

w := &p
w.X = 10
fmt.Println(*w) // 10,2
fmt.Println(p) // 10,2
// 在 go 中,任何为空的指针,都为 nil
// & 用来获取数据的地址,* 用来获取该地址中的值
// 使用 * 来对对象解引用的时候,如果指针为 nil,会导致异常
}
// 取地址符,对 int 等简单类型也适用
func modifyValue(x *int) {
*x = 100
}

y := 42
modifyValue(&y)
fmt.Println(y) // 100

接口

type Shape interface {
Print()
}
type Rectangle struct {}
type Triangle struct {}
func (r Rectangle) Print(){
fmt.Println("矩形")
}
func (t Triangle) Print(){
fmt.Println('三角形')
}

func main(){
var s Shape
s = Rectangle{}
s.Print() // 矩形
s = Triangle{}
s.Print() // 三角形
}

错误处理

func main(){
n, err := fmt.Println("ddd")
if err != nil {
//
}else {
// code
}
}

并发

func func1(){
time.Sleep(500* time.Milliscond)
fmt.Println("func1")
}
func func2(){
fmt.Println("func2")
}

func main(){
// go 关键字用来创建一个新的线程来执行内容
go func2()
func1()
}

Channels

func func1(ch chan string){
ch <- "函数1"
}
func func2(ch chan string){
ch <- "函数1"
}
func main(){
ch := make(chan string)
go func2(ch)
res1 := <-ch
go func1(ch)
res2 := <-ch
fmt.Println(res1,res2 )
}

参考文章

作者文章名称
峰华前端工程师https://www.bilibili.com/video/BV1HW4y1n7BF
从 js,转向go 语言https://prateeksurana.me/blog/guide-to-go-for-javascript-developers/