这是我参与「第五届青训营 」笔记创作活动的第1天
go语言简介:
go语言(或 Golang)是Google开发的开源编程语言,诞生于2006年1月2日下午15点4分5秒,于2009年11月开源,2012年发布go稳定版。Go语言在多核并发上拥有原生的设计优势,Go语言从底层原生支持并发,无须第三方库、开发者的编程技巧和开发经验。
go开发环境:
go:
下载地址:studygolang.com/dl
vs code:
下载地址:code.visualstudio.com/
Goland:
下载地址:www.jetbrains.com/go/download…
自己用的是goland,虽然vs code也下载了
go基础语法:
go语言hello world!(任何一门编程语言还是先把hello world!弄出来)
package main
import (
"fmt"
)
func main() {
fmt.Println("hello world!")
}
和C语言相似,go语言的基本组成有:
1.包声明,编写源文件时,必须在非注释的第一行指明这个文件属于哪个包,如package main。 引入包,其实就是告诉Go 编译器这个程序需要使用的包,如import "fmt"其实就是引入了fmt包。
2.函数,和c语言相同,即是一个可以实现某一个功能的函数体,每一个可执行程序中必须拥有一个main函数。
3.变量,Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。
4.语句/表达式,在 Go 程序中,一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾,因为这些工作都将由 Go 编译器自动完成。
5.注释,和c语言中的注释方式相同,可以在任何地方使用以 // 开头的单行注释。以 /* 开头,并以 */ 结尾来进行多行注释,且不可以嵌套使用,多行注释一般用于包的文档描述或注释成块的代码片段。
go_变量:
声明变量的一般形式是使用 var 关键字,具体格式为:var identifier typename
go中的内置类型包括bool;
int(32 or 64),int8,int16,int32,int64;
unit;
float;
string;
complex;
array;
slice;
map;
chan
package main
import (
"fmt"
"math"
)
func main() {
var a = "initial"
var b, c int = 1, 2
var d = true
var e float64
f := float32(e)
g := a + "foo"
fmt.Println(a, b, c, d, e, f) //initial 1 2 true
fmt.Println(g)
const s string = "constant"
const h = 500000000
const i = 3e20 / h
fmt.Println(s, h, i, math.Sin(h), math.Sin(i))
}
变量的类型:
1.函数内定义的变量为局部变量,这种局部变量的作用域只在函数体内,函数的参数和返回值变量都属于局部变量。这种变量在存在于函数被调用时,销毁于函数调用结束后。
2.函数外定义的变量为全局变量,全局变量只需要在一个源文件中定义,就可以在所有源文件中使用,甚至可以使用import引入外部包来使用。全局变量声明必须以 var 关键字开头,如果想要在外部包中使用全局变量的首字母必须大写。
3.函数定义中的变量成为形式参数,定义函数时函数名后面括号中的变量叫做形式参数(简称形参)。形式参数只在函数调用时才会生效,函数调用结束后就会被销毁,在函数未被调用时,函数的形参并不占用实际的存储单元,也没有实际值。形式参数会作为函数的局部变量来使用。
go_指针
与C相同,Go语言让程序员决定何时使用指针。变量其实是一种使用方便的占位符,用于引用计算机内存地址。Go 语言中的的取地址符是&,放到一个变量前使用就会返回相应变量的内存地址。
指针变量其实就是用于存放某一个对象的内存地址。
package main
import "fmt"
func add2(n int) {
n += 2
}
func add2ptr(n *int) {
// 指针 对传入参数进行修改
*n += 2
}
func main() {
n := 5
add2(n)
fmt.Println(n) // 5
add2ptr(&n)
fmt.Println(n) // 7
}
第一个函数add2相当于拷贝的形式,并不会改变实参,第二个函数add2ptr传入指针,会对传入参数进行修改,go语言中的指针相当于c++里指针的缩减版,没有那么多的操作,一般都是用来对函数传入参数进行修改
go_数组
和c语言相同,Go语言也提供了数组类型的数据结构,数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整型、字符串或者自定义类型
声明数组
Go 语言数组声明需要指定元素类型及元素个数,语法格式如下:
var variable_name [SIZE] variable_type
以上就可以定一个一维数组,我们举例代码如下:
var balance [10] float32
实例:
package main
import "fmt"
func main() {
var a [5]int
a[4] = 100
fmt.Println(a[4], len(a))
b := [5]int{1, 2, 3, 4, 5}
fmt.Println(b)
var twoD [2][3]int
for i := 0; i < 2; i++ {
for j := 0; j < 3; j++ {
twoD[i][j] = i + j
}
}
fmt.Println("2d:", twoD)
}
go_结构体
go中的结构体,与c中类似,是带类型字段的集合,我们可以在一个结构体中定义多个不同的数据类型。 声明结构体的形式: `
type user struct {
// 包含两个字段:name和password
name string
password string
}
如果要访问结构体成员,需要使用点号 . 操作符,格式为:结构体变量名.成员名。
例如:
`
c.password = "1024"
在 Golang 里面可以去为结构体定义一些方法,会有点类似其他语言中的类成员函数, 例如: checkpassword()的实现,从一个普通函数,改成了结构体方法,这样的话,就可以像 a.checkPassword("xx") 去调用,具体代码修改,就是把第一个参数,加上括号,写到函数名称前面
// 在实现结构体方法的时候有两种写法: // 1.带指针,可以对结构体中的内容进行修改 // 2.不带指针,实际操作就是一个 拷贝 ,无法对结构体进行修改
go_字符串
`
package main
import (
"fmt"
"strings"
)
// go里strings包中有很多字符串工具函数用strings.x()来实现
func main() {
a := "hello"
// Contains() : 判断一个字符串里面是否包含另一个字符串,返回结果类型为bool
fmt.Println(strings.Contains(a, "ll")) // true
// Count() : 字符串计数
fmt.Println(strings.Count(a, "l")) // 2
// HasPrefix() : strings.HasPrefix()函数用来检测字符串是否以指定的前缀开头
fmt.Println(strings.HasPrefix(a, "he")) // true
// HasSuffix() : strings.HasSuffix()函数用来检测字符串是否以指定的字符串结尾
fmt.Println(strings.HasSuffix(a, "llo")) // true
// Index() : 查找某一个字符串的位置
fmt.Println(strings.Index(a, "ll")) // 2
// Join() : 链接多个字符串
fmt.Println(strings.Join([]string{"he", "llo"}, "-")) // he-llo
// Repeat() : 重复多个字符串
fmt.Println(strings.Repeat(a, 2)) // hellohello
// Replace() : 替换字符
fmt.Println(strings.Replace(a, "e", "E", -1)) // hEllo
// Split() : 切片
fmt.Println(strings.Split("a-b-c", "-")) // [a b c]
// ToLower() : 小写字符串
fmt.Println(strings.ToLower(a)) // hello
// ToUpper() : 大写字符串
fmt.Println(strings.ToUpper(a)) // HELLO
// len() : 求字符串的长度
fmt.Println(len(a)) // 5
b := "你好"
// 一个中文字符可能对应多个字符
fmt.Println(len(b)) // 6
}
`
go_函数
函数是完成一定功能的程序指令 golang中的函数 参数类型采取后置新思
golang里面的函数原生支持返回多个值,一般两个,第一个是真正的结果,第二个是错误信息
go_map
map的底层原理是哈希表
golang中的map完全无序
package main
import "fmt"
func main() {
// 可以用amke来创建一个空的map(需要两个类型,key and value)
m := make(map[string]int) //[key:string value:int]
m["one"] = 1
m["two"] = 2
fmt.Println(m) //map[one:1 two:2]
fmt.Println(len(m)) // 2
fmt.Println(m["one"]) // 1
fmt.Println(m["unknow"]) // 0 找不到返回0
r, ok := m["unknow"]
fmt.Println(r, ok) // 0 false
delete(m, "one")
m2 := map[string]int{"one": 1, "two": 2}
var m3 = map[string]int{"one": 1, "two": 2}
fmt.Println(m2, m3)
}