Go基础语法使用

68 阅读1分钟

Go基础 | 青训营笔记

这是我参与「第五届青训营 」伴学笔记创作活动的第 N 天

Go基础

Go语言的特点

  • 高性能、搞并发
  • 语法简单、学习曲线平缓
  • 丰富的标准库
  • 完善的工具链
  • 静态链接
  • 快速编译
  • 跨平台
  • 垃圾回收

安装Golang环境的地址

基础语法

变量的定义

  • 第一种方法(可以指定类型,与我们常用的java等语言不同,先指定变量名再指定变量类型)
var a = 12

// 指定类型
var a int = 32;
  • 第二种方法
f := float32(1.2)
  • 第三种方法(定义常量)
const s = "ssss"

if else

判断里面没有括号

if x == 0 {
	fmt.Println("sss")
} else {
	fmt.Println("hhh")
}

循环(只有for 循环)

同样没有使用括号

for i := 1; i < 10; i++ {
	fmt.Pritln(i)
}

有continue和break来跳出循环

switch

这个switch更加强大,变量不仅仅只可以是数据,也可以是字符串等其他变量

a := 1
swatch a {
	case 1 :
		fmt.Println("111")
	default:
		fmt.Println("others")
}

// 也可以在switch后面不添加变量
t := time.Now()
swatch {
	case t.Hour() <12 :
		fmt.Println("am")
	default:
		fmt.Println("pm")
}

数组、切片和map

  • 数组
var a [5] int
b := [5] int {1,2,3,4,5}
  • 切片 (长度可变,相当于Java里面的列表)
s := make([] string, 3)
s[1] = "a"
// 使用append必须将结果返回给原数组
s = append(s, "b")
s = append(s, "c", "d")
len(s) // 4
s[1:3] // [b, c] 左闭右开
  • map
m := make(map[string[] int)
m["one"] = 1
len(m) // 1
delete(m, "one")

range (相当于python里面的枚举enumerate)

nums := []int{1, 2, 3}
for i, num := range nums {
	sum += num
}

// 遍历map
for k, v := range m {
}

函数

func add (a int, b int) int {
	return a + b
}

指针

这里的指针与学C语言的指针类似,指向这边变量所存储的地址,当我们想要修改一个变量的值并作为参数传入一个方法的时候,需要使用指针,即将该参数的地址传入,这样才会改变该参数的值。

// 无效
func add1(n int) {
	n += 2
}

// 有效
func add2(n *int) {
 *n += 2
}

add1(n)
add2(&n)

结构体

type user struct {
	name string
	pass string
}
a = user("ww", "ss")
a = user(name: "ww", pass: "ss")

错误处理

不同于Java、python等异常处理,Go的错误处理通常是在函数的返回值里面给出错误

type user struct {
	name string
	pass string
}
func findUser(users [], name string) (v *user, err error) {
	for _, user := range users {
		if user.name == name {
			return &user, nil
		} 
	}
	return nil, errors.New("not found")
}

字符串操作

a := "hello"
strings.Contains(a, "ll") // true
strings.Count(a, "l") // 2
strings.HasPrefix(a, "he") // true
strings.HasSuffix(a, "lo") // true
strings.Index(a, "ll") // 2
strings.Join([] string{"hel", "lo"}, "-") // hel-lo
strings.Repeat(a, 2) // hellohello
strings.Replace(a, "e, "E", -1) // hEllo
strings.Split("a-b-c", "-") // [a, b, c]
strings.ToUpper(a) // HELLO
strings.ToLower(a) // hello
len(a) // 5
b := "你好"
len(b) // 6

字符串格式化

%v 可以用于指定任意类型,%+v 包括字段类型,%#v 包括结构体信息

s := "hello"
p := point{1, 2}
fmt.Printf("s=%v\n", p) // p={1 2}
fmt.Printf("s=%+v\n", p) // p={x:1 y:2}
fmt.Printf("s=%#v\n", p) // p=main.point{x:1, y:2}

json处理

  • 将json序列化成字符串
buf, err = json.Marshal(a) // a json格式的结构体对象
  • 将字符串反序列化成结构体对象
var b User
err = json.Unmarshal(buf, &b) // **注意需要使用指针,因为我们要修改变量b**

时间解析

  • 获取时间
now := time.Now()
t := time.Date(2023, 1, 15, 20, 41, 34, 0, time.UTC)
  • 将时间格式化成你想要的字符串
t.Format("2006-01-01 10:10:10")
  • 字符串转时间
t3, err = time.Parse("2006-01-01 10:10:10")
  • 时间转时间戳
now.Unix()  // now是一个时间对象
now.UnixNano() //纳秒时间戳
  • 时间的加减
now.Add(time.Hour)
now.Sub(time.Hour)

参考链接