https://www.liwenzhou.com/ 从零开始搭建go
studygolang.com/pkgdoc golang标准文档
直接全局的go run build 不行吗,非要将环境安装到当前
GOPATH
go
打包当前目录文件
打包goroot 路径 或者 gopath 路径下的文件
打包并运行当前文件下的项目
查看当前go 的环境
设置属性
涉及到:
1. 关闭后 使用 go run 就会找两个地方,一个goroot,一个gopath没有再报错
2.开启后 只会找goroot 地址,没有就报错
软件安装包地址
开发环境地址
环境变量的作用就是:终端可以全局使用。
go install 命令会把生成的二进制文件拷贝到gopath/bin
package 的作用, 它必须和它文件的名字一样吗
go 有 25个关键字, 37 个保留字
go 语言中 非全局 变量声明必须使用,不使用就编译不过去
var (
a string
b boolen
)
var s3 = '1111'
s3 := '哈哈哈'
匿名变量 _, 多用于占位符
常量 const
const 中每新增一行常量声明将使 iota 计数一次
const a = iota
const b = iota
const (
a = iota
b = iota
c
)
const (
a1, a2 = iota + 1, iota + 2
b1, b2 = iota + 1, iota + 2
)
int32 也就rune
无符号整型
子主题1
八进制数 077
二进制输出 fmt.Printf("%b")
八进制输出 fmt.Printf("%o")
十进制输出 fmt.Printf("%d")
十六进制输出 fmt.Printf("%x")
十六进制数 0x1232456 (0x代表十六进制)
go 中无法直接定义二进制数, 需要定义一个10进制(八进制,十六进制)的进行转换
浮点数(只有两种选择)
默认是float64 位类型
float32
float64
complex64的实部和虚部为32位
complex128的实部和虚部为64位
bool 值(默认false)
1.go不允许将整型强制转为bool 值
2.bool 值无法参与数值运算,也无法与其他的类型进行转换
相应值的数据类型
相应值的默认格式, rune 默认是32位数字
二进制表示
十进制表示
八进制表示
十六进制表示,字母形式为小写 a-f
输出字符串表示
打印字符
Sprintf
Println
字符串类型(utf-8编码,支持中文)
go 中只能使用双引号进行包裹,单引号不是字符串
单引号包裹的是字符,(单独的字母,汉字,符号表示一个字符)
字节(一个字节 = 8bit(8个二进制位))
例如\
例如想将双引号打印出来
将字符串里面的数据原样输出(使用反引号` `, 这样也不会出现特殊符号的概念)
len 长度
字符串修改(字符串不能修改)
go 语言只有强制类型转换,没有隐式类型转换。
s2 := "白萝卜"
s3 := []rune(s2) // 把字符串强制转换成一个rune切片
s3[0] = '红' // 切片为一个个字符,所以赋值也需要是字符
fmt.Println(string(s3))
// for 循环基本使用
for i := 0; i < 10; i++ {
fmt.Println(i)
}
// 变种1
i := 0
for ; i < 10; i++ {
fmt.Println(i)
}
i := 5
for i < 10 {
fmt.Println(i)
i++
}
}
// 无限循环
str := "ssssss"
for index, v := range str {
fmt.Println("%v%v", index, v)
}
跳出当前循环
跳出当前循环,进行下次循环
跳出全部循环, 并到lable 标签的那部
var arr = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
for index, _ := range arr {
fmt.Println("index", index)
for index1, _ := range arr {
fmt.Println("index1", index1)
if index1 == 1 {
goto xx
}
}
}
fmt.Println("22")
xx:
fmt.Println("333")
go 语言是强类型,相同类型的变量才能比较
位运算符(针对的是二进制数)
a [3]int
切片的容量cap,是底层数组的容量
切片就是一个框,框住了一块连续内存。
切片属于引用类型,真正的数据都是保存在底层数组里的
s1 := [] {1,2,3,4}
s2 := s1[1:2]
cap(s2)
子主题2
go语言中不存在指针操作,只需要记住两个符合
1. &:取地址
2. * 根据地址取值
new 函数申请一个内存地址
make 也是用来内存分配地址,用来给,slice, map、chan申请内存的
make 和 new 的区别
1.make 和new都是用来申请内存的
2.new 很少用,一般用来给基本数据类型申请内存,string\int, 返回的是对应类型的指针
3.make是用来给slice、map、chan申请内存的,make函数返回的是对应的三个类型本身
map 设置值
for k, v := range map {}
delete(map, "key")
如果存在就删除,不存在也不会报错
go 语言只有强制类型转换,没有隐式类型转换。
编译的如果是可执行文件,一定要是main包,并使用main 函数
main 函数是入口参数,它没有参数,也没有返回值
1.函数编写学生管理系统
匿名嵌套结构体
更像继承,就继承其他的结构体内部的属性
fmt.print(person.city)
nil 是 interface、function、pointer、map、slice 和 channel 类型变量的默认初始值。但声明时不指定类型,编译器也无法推断出变量的具体类型。
open打开文件
close关闭文件,文件关闭遇见的问题
切片不是可以自动扩容吗? 但是文件操作的时候,还是根据它的容量进行切片的
切片是自动扩容的,但是文件操作的时候,长度是根据切片的len确定的
n, err := file.Read(rederFile), 返回的n是什么,不是字节,好像是容量长度
读取文件操作时通过 File 的方法 Read 进行的,这个方法接受一个参数 buf []byte ,默认读取的内容大小是 len(buf)
不能进行任何操作,包括读取,defer 用法就是当程序执行完毕,再执行操作
defer file.Close(), 中的defer用法
当方法执行完毕,再执行defer里面放置的操作
在文件中间写,例如文件有一个G
接口是什么
接口变量
空接口
接口底层
switch 方式我还不懂
定时器
把语言中的时间对象,转换成字符串类型的时间
时区概念
parse 默认的是零区时间
ParseInLocation 设置时间
time.Now 是获取当前时区的时间
Sub
它就是操作系统提供的socket抽象层进行实现的
它的下面有一系列的封装
tcp 服务端客服端的开发