GO语言基础笔记(中) | 青训营

68 阅读4分钟

GO基础语法

切片

定义: 可变长度的数组

声明: s := make([]string,3) 类型为string,长度为3

使用len(s)获取s的长度, 使用类似s[0] = "a"来对每一个位置进行赋值,整体功能与数组类似

使用append来在切片后面追加元素,使用方法:s = append(s."a")

注意: 要重新赋值给s(发生扩容后把新的指针重新赋值给s)

新建切片c,可以使用copy(c,s) 来将s的值赋值给c

fmt.Println(s[2:5])  // 从下标2输出到下标为5的元素
fmt.Println(s[2:])   // 从下标2开始输出所有元素
fmt.Println(s[:5])   // 从开头输出到下标为5的元素

map

使用最频繁的数据结构,非常重要!!!

随机顺序,与c++不同

声明: m := make(map[string]int) 前面的stringkey值,后面的intvalue值 ,每一个key值对应一个value

s := make(map[string]int)  
s["one"] = 1  
s["two"] = 2  
fmt.Println(s["one"])  
fmt.Println(s["unknown"])

fmt.Println(s["one"]) 输出对应的value值为1

fmt.Println(s["unknown"]) map中不存在的value值为0

r,ok := s["unknown"] 前面的r表示unknown这个key值对应的value值,后面的ok是一个bool变量,表示该key值是否存在于这个map中,存在为true不存在为false如果只声明了一个则只表示value

使用delete语句可以删除map中的元素,如delete(s,"one")后,"one"这个key值就被删除了

range

起遍历的作用

对于map

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

前面的值对应key,后面的值对应value

对于数组

s := []int{1, 2, 3}  
for index, value := range s {  
fmt.Println(index, value)  
}

前面index为下标,后面value为该下标对应的元素

如果只声明了一个则只表示对应的key或者下标

函数

go语言中变量的类型放在后面,在函数中同样如此

简单的实现a+b的函数

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

可以看到函数的基本结构,开头写一个func(几乎所有函数都要写吧),然后后面跟着这个函数的名字如add,后面再是传进来的参数(注意:变量类型要放在后面),最后是函数的返回类型如int,具体函数功能不同会有区别,但大体的结构如此

一般的函数都会设计成返回两个或者多个值(声明时要加括号),一个表示计算的结果,第二个表示错误信息

如下:

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

v表示value值,ok用来表示是否存在

指针

不同于c++中的指针,go语言中的指针功能十分有限

作用: 能够改变传进来参数的值

func add(i int) int{  
i+=2  
return i  
}   // 无法直接改变参数的值,需要重新赋值
func add2(i *int) {  
*i += 2  
}  // 使用指针,直接改变参数的值,不需要重新赋值

结构体

声明

type user struct {  
name string  
password string  
}

初始化

a := user{name: "hello world", password: "114514"}  
b := user{"hello world", "114514"}   // 可以省略"name:"和"password:"
c := user{name: "hello world"}  // 可以只初始化一个
var d user   // 也可以这样初始化
d.name = "hello world"

字符串

需要引入新的标准库strings

import (  
"fmt"  
"strings"  
)

strings中的函数

a := "hello"  
fmt.Println(strings.Contains(a, "ll")) // 判断字符串当中是否包含此子串  
fmt.Println(strings.Count(a, "l")) // 统计出现的次数  
fmt.Println(strings.HasPrefix(a, "he")) // 判断字符串是否以此子串开头  
fmt.Println(strings.HasSuffix(a, "llo")) // 判断字符串是否以此子串结尾  
fmt.Println(strings.Index(a, "llo")) // 给出该子串第一个字母在字符串中的位置  
fmt.Println(strings.Join([]string{"he", "llo"}, "-")) // 将两个字符串以指定符号连接  
fmt.Println(strings.Repeat(a, 2)) // 将字符串重复  
fmt.Println(strings.Replace(a, "e", "E", 2)) //将前n个字符串进行替换(将前2个"e"替换成"E"), 如果n=-1则替换所有  
fmt.Println(strings.Split("a-b-c", "-")) // 用自定义分割符号分割  
fmt.Println(strings.ToLower(a)) // 将字符串所有字母变成小写  
fmt.Println(strings.ToUpper(a)) // 将字符串所有字母变成大写

可以参考这个博客 (16条消息) Go 字符串_go 字符串包含_安悦悦ya的博客-CSDN博客)

基础语法还有一点放在下一篇笔记来写 笔者实在太懒了

总结

这篇依然是基础语法笔记,主要侧重于go的一些函数和数据结构,还是有不少新东西的比如说用range可以直接遍历,字符串的函数也比c++的要丰富很多。go的切片给我的感觉和vector很类似,也是一个很方便的数据结构,map感觉区别不大。后面的语法感觉很难,是完全没接触过的东西(虽然内容没有很多),得多学一会。