Go 语言入门指南:基础语法和常用特性解析 | 青训营

77 阅读2分钟

基础

语法

package main  // 入口包(入口文件)
import {
	"fmt"  // 导入包
}
func main() {
	fmt.Println("hello world")
}

不同文件可以是同一个包

变量

强类型 var a = "initial" 自动推导类型

var b int = 1 显式声明类型

f := float32(e)

const s string = "constant"

const h = 500000000 常量根据使用上下文自动确定类型

if else

if v := math.Pow(x, n); v < lim {
	return v
} else {
	fmt.Printf("%g >= %g\n", v, lim)
}
// 这里开始就不能使用 v 了

循环

// 仅有for
for {  
    fmt.Println("loop")  
    break  
}  
// 正常循环
for j := 7; j < 9; j++ {  
    fmt.Println(j)  
}

switch

case 后默认跟break

case 后可跟条件分支

switch {  
case t.Hour() < 12:  
    fmt.Println("It's before noon")  
default:  
    fmt.Println("It's after noon")  
}

switch time.Saturday {
case today + 0:
	fmt.Println("Today.")
case today + 1:
	fmt.Println("Tomorrow.")
default:
	fmt.Println("Too far away.")
}

数组

切片

可变长度数组 创建s := make([]string, 3)

追加s = append(s, "d")返回的类似指针,自动扩容

切片s[2:5] 不支持负数索引

map

创建m := make(map[string]int) map[key][value]

内部无序

range

遍历用

m := map[string]string{"a": "A", "b": "B"}  
	for k, v := range m {  
		fmt.Println(k, v) // b 8; a A  
	}

函数

可返回多个值,通常返回两个值(返回值和错误信息)

func exists(m map[string]string, k string) (v string, ok bool) {  
	v, ok = m[k]  
	return v, ok  
}

函数的闭包,有点像保存了静态变量

func adder() func(int) int {
	sum := 0
	return func(x int) int {
		sum += x
		return sum
	}
}

func main() {
	pos, neg := adder(), adder()  
	for i := 0; i < 10; i++ {
		fmt.Println(
			pos(i),
			neg(-2*i),
		)
	}
}

指针

同c

结构体

未赋值的部分会自动化为空值

结构体方法

有点像类的方法

type user struct {  
	name string  
	password string  
}  

// 带指针则可修改结构体,反之不可
func (u user) checkPassword(password string) bool {  
	return u.password == password  
} 

func main() {  
	a := user{name: "wang", password: "1024"}  
	fmt.Println(a.checkPassword("2048")) // true  
}

错误处理

函数返回两个值中的其中一个代表错误,可通过errors.New("")创建

字符串操作

见包strings 注意中文长度

字符串格式化

%v 、%+v、%#v 自动,越来越详细

JSON

结构体公开字段首字母大写

type userInfo struct {  
	Name string  
	Age int `json:"age"`  //序列化后是小写,应该是重命名
	Hobby []string  
}

序列化buf, err := json.Marshal(a)

反序列化json.Unmarshal(buf, &b)

时间

见包time

数字解析

见包 strconv

进程信息

包os、os/exec

线程

并发使用,注意堵塞以及锁的情况

go func 

实战

猜数

简单

读取时采用Scan(&input)

在线词典

defer

延迟调用机制,在函数执行完毕后逆序执行

调用api简单方法

  1. 抓取请求
  2. 将请求转为go代码
  3. 将JSON改为go代码
  4. 更改相应值
  5. 发送回去

SOCKS5 代理服务器

开一个防火墙端口

遇到的问题

  • Printf有格式化,Println没有