01-数据类型 1、数据类型分类值类型:基本数据类型是Go语言实际的原子,复合数据类型是由不同的方式组合基本类型构造出来的数据类型,如:数组,slice,map,结构体 1234567整型 int8,uint # 基础类型之数字类型浮点型 float32,float64 # 基础类型之数字类型复数 # 基础类 2024-12-02 Go #Go
01-数据类型之值类型之字符串 1、字符Golang 中没有专门的 字符 类型,如果要存储单个字符(字母),一般使用 byte 来保存,且使用单引号包裹。 12345678var c1 byte = 'a'var c2 byte = '0'fmt.Println("c1=", c1) //输出 97 fmt.Println("c2=", c2) //输出 48fmt.Printf("c1=%c,c2=%c 2024-12-02 Go #Go
01-数据类型之值类型之数值 1、数值类型数值类型指基本类型中的:整型、浮点型、复数。 2、整数整数类型有无符号(如 int)和带符号(如 uint)两种,这两种类型的长度相同,但具体长度取决于不同编译器的实现。 int8、int16、int32 和 int64 四种有符号整数类型,分别对应 8、16、32、64bit 大小的有符号整数 uint8、uint16、uint32 和 uint64 对应四种无符号整数类型。 2024-12-02 Go #Go
01-数据类型之值类型之数组 1、数组1.1、数组的声明数组是一段固定长度的连续内存区域。数组的长度定义后不可更改,长度使用 len() 获取。 123456var arr1 [10]int //定义长度为10的整型数组,很少这样使用arr2 [5]int := [5]int{1,2,3,4,5} //定义并初始化arr3 := [5]int{1,2,3,4,5} //自动推 2024-12-02 Go #Go
01-数据类型之值类型之结构体 一 结构体的基本使用结构体可以用来声明新的类型,作为其他类型的属性/字段的容器,如下定义一个学生结构体: 1234567891011121314151617181920type Person struct { name string age int}//按顺序初始化:每个成员都必须初始化var p1 Person = Person{"lisi", 20 2024-12-02 Go #Go
01-数据类型之引用类型之切片 1、切片创建切片(slice)解决了数组长度不能扩展,以及基本类型数组传递时产生副本的问题。 常用创建方式: 1234var s1 []int // 和声明数组一样,只是没有长度,但是这样做没有意义,因为底层的数组指针为nils2 := []byte {'a','b','c'}fmt.Println(s1) //输出 []fmt.Print(s2) //输出 2024-12-02 Go #Go
01-数据类型之引用类型之指针 1、指针1.1、指针的创建Go 保留了指针,代表某个内存地址,默认值为 nil,使用 & 取变量地址,通过 * 访问目标对象。 简单示例: 12345var a int = 10fmt.Println("&a=", &a) // 0xc000096008 一个十六进制数var p *int = &afmt.Println("*p=", *p) // 10 2024-12-02 Go #Go
01-数据类型之引用类型之集合 1、集合 map1.1、map 的创建Go 内置了 map 类型,map 是一个无序键值对集合(也有一些书籍翻译为字典)。 普通创建: 123// 声明一个map类型,[]内的类型指任意可以进行比较的类型 int指值类型m := map[string]int{"a":1,"b":2}fmt.Print(m["a"]) make 方式创建: 1234567891011121 2024-12-02 Go #Go
01-类型转换与别名 1、数据类型转换1.1、显式转换Go 在不同类型的变量之间赋值时需要显式转换。也就是说 Go 中数据类型不能自动转换。 1.2、数值类型转换123var i int32 = 100var n1 float64 = float64(i)fmt.Printf("n1=%v", n1) //输出100 注意:在转换中,比如将int64转成int8【-128---127】,编译时不会报错,只是转换的结果是 2024-12-02 Go #Go
02-变量 1、变量声明Go 变量声明的三种方式: 123var a int // 声明一个变量,默认为0var b = 10 // 声明并初始化,且自动推导类型c := 20 // 初始化,且自动推导 注意: :=定义变量只能在函数内部使用,所以经常用var定义全局变量 Go 对已经声明但未使用的变量会在编译阶段报错:** not used Go 中的标识符以字母或者下划 2024-12-02 Go #Go
02-常量 1、常量常量:在编译阶段就确定下来的值,程序运行时无法改变。 定义方式: 123const A = 3const PI float32 = 3.1415const mask = 1 << 3 //常量与表达式 错误写法:常量赋值是一个编译期行为,右边的值不能出现在运行时才能得到结果的值。 1const HOME = os.GetEnv("HOME") 2、无类型常量 2024-12-02 Go #Go
03-流程控制 1、流程控制之-条件语句1.1 判断语句 if示例: 123// 初始化与判断写在一起: if a := 10; a == 10if i == '3' { } if 的特殊写法: 12if err := Connect(); err != nil { // 这里的 err!=nil 才是真正的if判断表达式} 1.2 分支语句 sw 2024-12-02 Go #Go
04-运算符 1、运算符1.1、运算符汇总123456算术运算符: + - * / % ++ -- 关系运算符: == != <= >= < > 逻辑运算符: ! && ||位运算: &(按位与) |(按位或) ^(按位取反) <<(左移) >>(右移)赋值运算符: = += -= *= /= %= <<= >> 2024-12-02 Go #Go
05-函数之闭包 1、闭包(Closure)1.1、闭包概念闭包是引用了自由变量的函数,被引用的自由变量和函数一同存在,即使己经离开了自由变量的环境也不会被释放或者删除,在闭包中可以继续使用这个自由变量。 简单的说:函数+引用环境=闭包 贴士:go 的闭包在某些编程语言中也被称为 闭包(如 Python) 在闭包中可以修改引用的变量: 123456str := "hello"foo := func() 2024-12-02 Go #Go
05-函数简介 1、函数1.1、函数声明函数声明格式: 1234func 函数名字(参数列表) (返回值列表){ // 函数体 return 返回值列表} 注意: 函数名首字母小写为私有,大写为公有; 参数列表可以有0-多个,多参数使用逗号分隔,不支持默认参数; 返回值列表返回值类型可以不用写变量名 如果只有一个返回值且不声明类型,可以省略返回值列表与括号 如果有返回值,函数内必须有 re 2024-12-02 Go #Go
06-反射使用 https://golang.org/pkg/reflect/ 1、介绍Go 语言实现了反射。我们一般用到的包是reflect包,反射包中有两对非常重要的函数和类型,两个函数分别是: 方法名 描述 reflect.TypeOf 可以获得任意值的类型对象,返回类型:reflect.Type reflect.ValueOf 可以获得任意值的值对象,返回类型:reflect.Valu 2024-12-02 Go #Go
06-反射概述 1、反射概述 反射是指 在程序运行期对程序本身进行访问和修改的能力。即可以在运行时动态获取变量的各种信息,比如变量的类型(type),类别(kind),如果是结构体变量,还可以获取到结构体本身的信息(字段与方法),通过反射,还可以修改变量的值,可以调用关联的方法。 程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分。在运行程序时,程序无法获取自身的信息。 支持反射的语言可 2024-12-02 Go #Go
11-面向对象之三大特性 1、面向对象三大特性1.1、封装封装:把抽象出的字段和对字段的操作封装在一起,数据被保护在内部,程序的其它包只有通过被授权的操作(方法),才能对字段进行修改,其作用有: 隐藏实现细节 可以对数据进行验证,保证安全合理 Go 对面向对象做了极大简化,并不强调封装特性,下列示例进行模拟实现: 在 person 包下新建 person.go 文件: 1234567891011121314151617 2024-12-02 Go #Go
11-面向对象之构造函数与方法 1、面向对象初识1.1、模拟构造函数Go 和传统的面向对象语言如 Java 有着很大区别。结构体没有构造函数初始化功能,可以通过以下方式模拟: 123456789101112131415161718192021type Person struct { Name string Age int}func NewPersonByName(name string) *Person 2024-12-02 Go #Go
12-面向对象之接口的使用 1、接口 interface接口是调用方和实现方均需要遵守的一种约束,约束开发者按照统一的方法命名、参数类型、数量来处理具体业务。实际上,接口就是一组没有实现的方法声明,到某个自定义类型要使用该方法时,根据具体情况把这些方法实现出来。接口语法: 12345type 接口类型名 interface { 方法名1(参数列表) 返回值列表 方法名2(参数列表) 返回值列表 ...} 2024-12-02 Go #Go