3.1 变量定义方法
1、var定义变量
var 变量名 类型 = 表达式
var name string = “zhangsan”
var age int = 24
2、短变量
name := “zhangsan” //短变量只能用于声明局部变量,不能用于全局变量
3、一次定义多个变量
package main
import "fmt"
func main() {
var username, sex string
username = "zhangsan"
sex = "男"
fmt.Println(username, sex)
}
4、批量声明变量
package main
import "fmt"
func main() {
var (
a string
b int
c bool
)
a = "zhangsan"
b = 24
c = true
fmt.Println(a, b, c)
}
3.2 常量定义
package main
import "fmt"
const name = "zhangsan"
func main() {
fmt.Println(name)
}
const同时声明多个常量时,如果省略了值则表示和上面一行的值相同。
package main
import "fmt"
const (
n1 = "zhangsan"
n2
n3
)
func main() {
fmt.Println(n1, n2, n3)
}
3.3 fmt包
- println:
- 一次输入多个值的时候println中间有空格
- println会自动换行,print不会
- print:
- 一次输入多个值的时候print中间没有空格
- print不会自动换行
- printf:
- printf是格式化输出,在很多场景下比println方便
package main
import "fmt"
func main() {
name := "zhangsan"
age := 20
fmt.Printf("%s 今年 %d 岁", name, age)
}
3.4 init函数和main函数
- init 函数
- go语言中init函数用于包(package)的初始化,该函数是go语言的一个重要特性
- 有下面的特征:
- init函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等
- 每个包可以拥有多个init函数
- 包的每个源文件也可以拥有多个init函数
- 同一个包中多个init函数的执行顺序go语言没有明确的定义
- 不同包的init函数按照包导入的依赖关系决定该初始化函数的执行顺序
- init函数不能被其他函数调用,而是在main函数执行之前,自动被调用
- main函数
// go语言程序的默认入口函数(主函数): func main()
// 函数体用{} 一对括号包裹
func main() {
//函数体
}
3.5 golang中关键字
var 和 const:变量和常量的声明
package 和 import: 导入
func:用于定义函数和方法
return:用于从函数返回
defer:在函数退出之前执行
go:用于并行
select:用于选择不同类型的通讯
interface:用于定义接口
struct:用于定义抽象数据类型
break、case、continue、for、fallthrough、else、if、switch、goto、default:流程控制
chan:用于channel通讯
map:用于声明map类型数据
range:用于读取slice、map、channel数据
3.6 命名规范
四、 基本数据类型
4.1 内置类型
4.2 内置函数
4.3 基本类型介绍
五、数字
5.1 数字类型
5.2 数字定义
1、定义数字类型
package main
import "fmt"
func main() {
var a int8 =4
var b int32 = 4
var c int64 = 4
d := 4
fmt.Printf("a: %T %v \n", a, a)
fmt.Printf("b: %T %v \n", b, b)
fmt.Printf("c: %T %v \n", c, c)
fmt.Printf("d: %T %v \n", d, d)
}
/*
a: int8 4
b: int32 4
c: int64 4
d: int 4
*/
2、reflect.TypeOf 查看数据类型
package main
import (
"fmt"
"reflect"
)
func main() {
var a int8 =4
var b int32 = 4
var c int64 = 4
d := 4
fmt.Println(reflect.TypeOf(a))
fmt.Println(reflect.TypeOf(b))
fmt.Println(reflect.TypeOf(c))
fmt.Println(reflect.TypeOf(d))
}
/*a: int8 4
b: int32 4
c: int64 4
d: int 4 */
5.3 布尔值
- Go语言中以布尔类型进行声明布尔型数据,布尔型数据只有true(真)和false(假)两个值。
- 注意:
-
- 布尔类型的变量的默认值为false
-
- Go语言中不允许将整型强制转换为布尔型
-
- 布尔型无法参与数值运算,也无法与其他类型进行转换
package main
import (
"fmt"
"unsafe"
)
func main() {
var b = true
fmt.Println(b, "占用字节:", unsafe.Sizeof(b))
}
六、字符串
6.1 字符串
1、字符串
s1 := "hello"
s2 := "你好"
2、多行字符串
package main
import "fmt"
func main() {
s1 := `
第一行
第二行
第三行`
fmt.Println(s1)
}
3、byte和rune
4、字符串的常见操作
len(str) //求长度
fmt.Sprintf //拼接字符串
strings.Split //分割
strings.Contains //判断是否包含
strings.HasPrefix,strings,HasSuffix //前缀/后缀判断
strings.Index(),strings.LastIndex() //子串出现的问题
stings.Join(a[]string,sep string) //join操作
6.2 字符串的常用操作
1、len(str)
package main
import "fmt"
func main() {
str := "this is str"
fmt.Println(len(str))
}
2、+(拼接)
package main
import "fmt"
func main() {
var1 := "nihao"
var2 := "zhangsan"
var3 := (var1 + var2)
fmt.Println(var3)
}
3、strings.Split()
package main
import (
"fmt"
"strings"
)
func main() {
var s string = "123-456-789"
var arr = strings.Split(s, "-")
fmt.Println(arr)
}
4、strings.Join()
package main
import (
"fmt"
"strings"
)
func main() {
str := "123-456-789"
arr := strings.Split(str, "-")
fmt.Println(arr)
arr1 := strings.Join(arr, "*")
fmt.Println(arr1)
}
5、单引号
package main
import "fmt"
func main() {
a := 'a'
fmt.Println(a) //97 这里输出的是a字符的ASCII值
fmt.Printf("a的值是%c", a) // a的值是a
}
6.3 字符串遍历
1、遍历字符串
package main
import "fmt"
func main() {
s := "hello 张三"
for i :=0; i < len(s); i++ {
fmt.Printf("%v(%c)", s[i], s[i])
}
fmt.Println()
for _, r := range s {
fmt.Printf("%v=>%c ", r, r)
}
}
2、修改字符串
- 要修改字符串,需要先将其转换成[]rune或者[]byte,完成后再转换为string。
package main
import "fmt"
func main() {
s := "美国第一"
s_rune := []rune(s)
fmt.Println("中国" + string(s_rune[2:]))
}
6.4 转string
strconv
package main
import (
"fmt"
"strconv"
)
func main() {
// 1、int转成string
var num1 int = 20
s1 := strconv.Itoa(num1)
fmt.Printf("%T, %v \n", s1, s1) // string, 20
// 2、float转成string
/*参数1:要转换的值
参数2:格式化类型
参数3:保留的小数点-1(不对小数点格式化)
参数4:格式化的类型*/
var num2 float64 = 20.113123
s2 := strconv.FormatFloat(num2, 'f', 2, 64)
fmt.Printf("%T, %v \n", s2, s2) //string, 20.11
// 3、bool转string
s3 := strconv.FormatBool(true)
fmt.Printf("%T, %v \n", s3, s3)
// 4、int64转string
var num3 int64 = 28
s4 := strconv.FormatInt(num3, 10) //第二个参数10为 进制
fmt.Printf("%T, %v", s4, s4)
}
6.5 string与int转换
strconv.Itoa
package main
import (
"fmt"
"strconv"
)
func main() {
num := 100
num1 := strconv.Itoa(num)
fmt.Printf("%T, %v \n", num, num) // int, 100
fmt.Printf("%T, %v \n", num1, num1) // string, 100
num2, _ := strconv.Atoi(num1)
fmt.Printf("%T, %v \n", num2, num2) // int, 100
}
七、数组array
7.1 数组介绍
1、array介绍
- 数组是指一系列同一类型数据的集合。
- 数组中包含的每个数据被称为数组元素(element),这种类型可以是任意的原始类型,比如int、string等
- 一个数组包含的元素个数被称为数组的长度
- 在Golang中数组是一个长度固定的数据类型,数组的长度是类型的一部分,也就是说[5]int和[10]int是两个不同的类型
- Golang中数组的另一个特点是占用内存的连续性,也就是说数组中的元素是被分配到连续的内存地址中的,因而索引数组元素的速度非常快。
- 和数组对应的类型是Slice(切片),Slice是可以增长和收缩的动态序列,功能也更灵活
2、数组定义
var 数组变量名 [元素数量]T
- 比如: var a [5]int 数组的长度必须是常量,并且长度是数组类型的一部分。
- 一旦定义,长度不能变
package main
import "fmt"
func main() {
var a[5]int
var b[3]int
b[0] =80
b[1] =90
b[2] =100
fmt.Println(a)
fmt.Println(b)
}
7.2数组的遍历
1、普通遍历数组
package main
import "fmt"
func main() {
// var a = [...]string {"北京", "上海", "杭州"}
var a =[3]string {"北京", "上海", "杭州"}
fmt.Println(a)
for i :=0;i < len(a);i ++ {
fmt.Println(a[i])
}
}
2、k,v遍历数组
package main
import (
"fmt"
)
func main() {
var a =[...]string{"北京", "上海", "杭州"}
for index, value := range a {
fmt.Println (index, value)
}
}