go学习
go学习
go的变量声明
var 变量名 type
go语言中的变量是需要声明之后才能使用,同一作用域内不支持重复声明,并且go语言的变量声明后必须使用
批量声明:
var(
name string
age int
b bool
)
类型推断
var name="zhangsan"
批量初始化:
var name,age,b="zhangsan",10,true
短变量声明
在函数内部可以使用:=运算符对变量进行声明和初始化
func main(){
name :="zhangsan"
age :=20
}
go语言常量
常量,就是在程序编译阶段就确定下来的值,而城西在运行是则无法改变该值,在go程序中
定义常量的语法
const name [type]=value
iota
iota比较特殊,可以被认为是一个可悲编译器修改的常量,他的默认开始值是0,没调用一次加1,遇到const关键字是被重置为0
const(
a1=iota
a2=iota
)
可以使用_来跳过一个值
go语言中的数据类型
字符型,整形,float型,布尔型
使用%可以打印出变量的类型
注意不能使用0和非0表示真假
go语言中的字符串
一个go语言字符串是一个任意字节的常量序列。(其实就是一个数组)
s :=
`
a
a
c
v
//多行字符串声明
`
字符串的连接
1.加号连接
2.使用fmt.pring方法来进行连接
3.使用方法string.join 方法来连接
join会根据字符串数组的内容,计算出一个拼接zhihui的长度,然后申请对应大小的内存,一个一个字符串填入,在已有一个数组的情况下,这种效率会更高
go语言中常用的字符串方法
- len() ----求长度
- strings.Split ----分割
- strings.contains ---判断是否包含
- strings.HasPrefix,strings.HasSuffix ----前缀后缀判断
- strings.indx(),strings.lastindx --子串出现的位置
- strings.Contains ---检查是否包含,是返回true不是返回false
- strings.Tolower 转换为小写
- strings.toupper 转换为大写
Switch语句
注意事项
- 支持多条件匹配
- 不同的case之间不适用break分割。默认只会执行一个case
- 如果想要执行多个case需要使用fallthrough关键字,也可以使用break终止
- 分支还可以使用表达式
Switch day{
case 1,2,3,4,5: fmt.Println("工作日")
case 6,7:
fmt.Println("休息日日")
default:
fmt.Println("非法输入")
}
for range循环
go语言中可以使用for range来进行遍历。通过 for range遍历的返回值有以下规律
- 数组,切片字符串返回索引和值
- map返回键和值
- 通道值返回通道内的值
实例:
a :=[3]int{1,2,3}
for i,v :=range a{
fmt.Println("i:%d , v:%v\n",i,v)
}
切片
简单点来说切片是一个可变的数组
切片声明:
方法一:var s1 []int
方法二:var s2 =make([]int,2)
go语言切片的长度和容量
切片拥有自己的长度和容量,我们可以通过内置的len()函数求长度,使用内置的cap()函数求切片的容量
切片初始化
使用数组进行初始化
s1 :=[...]int{1,2,3}
s2 :=si[1:3]
切片中的增加和删除
增加:append()
删除:append(a[:index],a[index+1:]...)
go语言中的map
map的语法格式:
var 变量名 map[key的数据类型]值的数据类型
go函数
函数声明:
fun 函数名(变量[变量类型])(返回值[返回值类型]){
}
在go中函数可以被当做参数,也可以作为返回值传递
例子:
package main
// 函数作为返回值
import "fmt"
func pr(name string) {
fmt.Printf("name: %v\n", name)
}
func kk(name1 string,f func(string)) {
f(name1)
}
func add(a int, b int) int {
return a + b
}
func jian(a int, b int) int {
return a - b
}
func sw(i int)(func(int, int)int) {
switch i {
case 1:
return add
case 2:
return jian
default:
return nil
}
}
func main() {
// ff := sw(1)
// s := ff(1, 3)
ff :=sw(1)
s:=ff(1,2)
fmt.Printf("s: %v\n", s)
kk("zhangsan",pr)//函数作为参数
}
匿名函数:
man :=func (a int,b int)int {
if a>b {
return a
}else{
return b
}
}
sx :=man(30,4)
fmt.Printf("sx: %v\n", sx)
go语言中的defer语句
go语言中的defer语句会将其后面跟随的雨具进行延迟处理,defer归属的函数即将返回时,将演示处理的语句安defer定义的逆序进行执行,也就是说,先被defer的雨具最后执行,最后的语句先执行------这里可以类似栈的特性
package main
import "fmt"
func main() {
fmt.Println("开始")
defer fmt.Println("s1")
defer fmt.Println("s2")
defer fmt.Println("s3")
fmt.Println("end")
}
执行结果
开始
end
s3
s2
s1
init函数
主要特点
- 先于main函数执行(自动执行)不能被其他函数调用
- 没有输入参数,返回值
- 每个包可以有多个init函数
go初始化顺序
变量初始化—>init()—>main()
go指针
var 指针变量名 *type
go结构体
type 结构体name struct{}
go方法
func ( 结构体变量 结构体名)函数名(参数)返回类型{}
值类型和指针类型,在进行传参是值类型不会改变,指针类型会被改变
type name struct {
name string
}
p1 :=name{
name: "zhgangsan",
}
p2 :=&name{
name: "lisi",
}
// p1是指类型
// p2是指针类型
GOLANG接口
接口想是一个公司里面的领导,他会定义一些通用规则,只设计而不实现
go语言的接口是一种新的类型定义,他把所有的具有共性的方法定义在一起
语法格式
type name interface{
}
一个实例可以实现多个接口
go通过接口实现ocp设计原则
golang包管理工具
初始化模块:
go mod init <项目名称>

浙公网安备 33010602011771号