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语句
注意事项
  1. 支持多条件匹配
  2. 不同的case之间不适用break分割。默认只会执行一个case
  3. 如果想要执行多个case需要使用fallthrough关键字,也可以使用break终止
  4. 分支还可以使用表达式
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遍历的返回值有以下规律

  1. 数组,切片字符串返回索引和值
  2. map返回键和值
  3. 通道值返回通道内的值

实例:

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 <项目名称>
posted @ 2023-11-03 00:19  kill比尔  阅读(19)  评论(0)    收藏  举报