Go语言基础|青训营笔记
这是我参与[第五届青训营]笔记创作的第一天
Go语言的魅力
介绍:什么是Go语言
- 高性能、高并发
- 语法简单、学习曲线平缓
- 丰富的标准库
- 完善的工具链
- 静态链接
- 快速编译
- 跨平台
- 垃圾回收
总结:Go语言是一个简单易懂的语言,同时又具有高效工程能力的语言
Go的基础语法
package main
import "fmt" \\导入fmt包,输入输出字符串,格式化字符串
func main() {
fmt.Println("Hello, World!")
}
变量
变量:
相较于java或者时c++等,Go的变量定义是非常的简单,可是直接使用var来自动推导变量的类型,不需要像java那样自己定义类型:var a = 4 、 var b = true
当然也可以自己选择定义:var b int = 8
当然还有更加简单的方法,通过:=的直接定义:num := 值方式,
常量:
类似于var 的方法 const自动确定常量类型
if else
package main
import (
"fmt"
)
func main() {
if 7%2 == 0 {
fmt.Println("7 is even")
} else {
fmt.Println("7 is odd")
}
}
从中我们可以看到if后面没有()小括号
循环
只有for循环 for中什么都不写就是一个死循环
switch
可以使用任意的变量类型 :字符串,结构体等
在这里可以借用另外网站一博主的代码
数组
var a [5]int
b := [5]int
var c [5][5]int
切片
不同于数组,可变长度的数组,且功能强大
用 make创建一个切片:s := make([]string,3)
可以通过append来增加元素,当数组长度不够时会自动扩容,并返回一个新的。所以需要再赋值回去:
s := make([]string,2)
s[0] = "0"
s[1] = "1"
s = append(s,"3")\\自动扩容且需要重新赋值
同时具有切片操作
s := make([]string,3)
s[0] = "0"
s[1] = "1"
s[2] = "2"
fmt.Println(s[0:2]) \\ [0 1] 不包括第2个元素
fmt.Println(s[:2]) \\[0 1]
fmt.Println(s[1:]) \\[1 2]
类似于java中substring方法,但也仅仅是类似哈
map
Go中的map是完全无序的
首先可以通过make(map[Key]value创建一个空map
然后写入(在这里m := make(map[string]int)举例):
m["a"] = 1
m["b"] = 2
fmt.Println(m["a"]) // 1
可以通过ok方法来获取map里面是否有key存在
m["a"] = 1
r,ok :=m["c"]
fmt.Println(r,ok) //0 false
r, ok = m["a"]
fmt.Println(r, ok) //1 true
delete删除
delete(m,"a") //删除了map[a:1]
range
首先就是可以方便遍历
传统的方法:
func main() {
str := "abc"
//通过for打印每个字符
for i := 0; i < len(str); i++ {
fmt.Printf("str[%d]=%c\n", i, str[i])
}
用range的方法
str := "abc"
for i ,o := range str {
fmt.Printf("str[%d]=%c\n", i, str[o])
}
两种方法结果都是一样的
其次为了更好的理解range
package main
import "fmt"
func main() {
//这是我们使用range去求一个slice的和。使用数组跟这个很类似
nums := []int{2, 3, 4}
sum := 0
for _, num := range nums {
sum += num
}
fmt.Println("sum:", sum)
//在数组上使用range将传入index和值两个变量。上面那个例子我们不需要使用该元素的序号,所以我们使用空白符"_"省略了。有时侯我们确实需要知道它的索引。
for i, num := range nums {
if num == 3 {
fmt.Println("index:", i)
}
}
//range也可以用在map的键值对上。
kvs := map[string]string{"a": "apple", "b": "banana"}
for k, v := range kvs {
fmt.Printf("%s -> %s\n", k, v)
}
//range也可以用来枚举Unicode字符串。第一个参数是字符的索引,第二个是字符(Unicode的值)本身。
for i, c := range "go" {
fmt.Println(i, c)
}
}
函数
指针
需要使用*
package main
import "fmt"
func main() {
n := 5
add(&n)
fmt.Println(n)
}
func add(n *int) {//将n写成一个指针类型
*n += 2
}
字符串操作
使用方法:
a := "hello"
fmt.Println(strings.xxx())
Contains 判断字符串是否包含
Count 字符串计数
Index 查找位置
Join 连接字符串
Repeat 重复字符串
Replace 替换
字符串格式化
用法与java差不多,但是功能更加强大
fmt.Println("s=%v",s) %v来打印任意类型的变量,不需要区分
使用%+v更加详细
使用%#v更加更加详细
JSON处理
时间处理
time.Now()获取时间
time.Date
time.Year
t.Format格式化
进程信息
os.Args 返回进程信息
os.Getenv 返回
exec.Command 启动此进程并且获取其输入输出