Go语言基础|青训营笔记

166 阅读3分钟

Go语言基础|青训营笔记

这是我参与[第五届青训营]笔记创作的第一天

Go语言的魅力

介绍:什么是Go语言

  1. 高性能、高并发
  2. 语法简单、学习曲线平缓
  3. 丰富的标准库
  4. 完善的工具链
  5. 静态链接
  6. 快速编译
  7. 跨平台
  8. 垃圾回收

总结:Go语言是一个简单易懂的语言,同时又具有高效工程能力的语言

Go的基础语法

package main 

import "fmt" \\导入fmt包,输入输出字符串,格式化字符串

func main() {

	fmt.Println("Hello, World!") 
}

变量

变量:

相较于java或者时c++等,Go的变量定义是非常的简单,可是直接使用var来自动推导变量的类型,不需要像java那样自己定义类型:var a = 4var 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 启动此进程并且获取其输入输出