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) 前面的string为key值,后面的int为value值
,每一个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感觉区别不大。后面的语法感觉很难,是完全没接触过的东西(虽然内容没有很多),得多学一会。