十八. GOTO语句
- 通过标签进行代码间的无条件跳转
func main() {
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if j == 2 {
// 设置退出标签
goto breakTag
}
}
}
return
breakTag:
fmt.Println("结束循环")
}
十九.接口
1 接口的概念
go语言将一些公共的处理逻辑模板集中在接口中
2 接口的案例
type Student struct{
ownName string
ownAge int
ownAddress string
}
type People interface {
age()
}
func (stu Student) age() {
fmt.Println("stu.ownName")
}
func main() {
//var stu1 Student
//stu1 = Student{}
//stu1.ownName = "jack"
//stu1.ownAge = 23
//stu1.ownAddress = "西安"
//stu1.age()
var peo People
peo = new(Student)
peo.age()
}
3 利用接口修改结构体中的属性
- 类似于java中的set,get方法
type Student struct {
name string
}
type people interface {
getName()
setName(name string)
}
func (stu Student) getName() {
fmt.Println(stu.name)
}
func (stu *Student) setName(name string) {
stu.name = name
}
func main() {
var stu Student = Student{"jack"}
stu.getName()
stu.setName("rise")
stu.getName()
}
二十.方法
1方法的使用细节
方法名小写,只能在本包使用,方法名大写,可以在本包和其他包使用
2 函数和方法的区别
方法一般指的是与结构体绑定的方法,函数指的就是普通的函数。
二十一.文件的操作
1 流
- 输入流
数据从数据源(文件)到程序(内存)的路径 - 输出流
数据从程序(内存)到数据源(文件)的路径
2 打开关闭文件
func main(){
file, err := os.Open("F:\\a.txt")
if err != nil{
fmt.Println("打开文件出错")
}else {
fmt.Printf("file=%v", file)
}
//关闭文件
err1 :=file.Close()
if err != nil{
fmt.Println("关闭文件出错",err1)
}
}
3 使用缓冲区读取文件
file, err := os.Open("F:\\a.txt")
if err != nil{
fmt.Println("打开文件出错")
}
//defer:函数要退出时,会调用后面的内容
defer file.Close()
reader := bufio.NewReader(file)
for{
//读到换行符就截至,每行都有换行符
str, err := reader.ReadString('\n')
if err == io.EOF{
fmt.Println("已经读到文件的末尾了")
break
}
fmt.Println(str)
}
}
4 一次性读取文件
- open和close都被封装到ReadFile中了
func main(){
file := "f://a.txt"
content, err := ioutil.ReadFile(file)
if err != nil{
fmt.Println("读取的文件出错",err)
}
//content是字节类型的数组
fmt.Println(string(content))
}
5 写入文件
func main(){
filename := "f://a.txt"
file, err := os.OpenFile(filename, os.O_WRONLY | os.O_CREATE, 0666 )
if err != nil{
fmt.Println("打开文件出错")
return
}
defer file.Close()
str := "hello, my daday"
writer :=bufio.NewWriter(file)
writer.WriteString(str)
//write是写入缓存中的,flush是写入到文件中
writer.Flush()
fmt.Println("写入成功")
}
6 判断文件是否存在
func judgaFile(filePath string){
_,err := os.Stat(filePath)
if err == nil{
fmt.Println("文件存在")
return
}
if os.IsNotExist(err) {
fmt.Println("文件不存在")
return
}
fmt.Println("不确定文件存在不存在")
}
func main(){
pathName := "f://a1.txt"
judgaFile(pathName)
}
二十二.面向对象
1 抽象
将一类对象的共有属性和行为抽取出来形成一个物理模型
2 封装
将抽查的对象的字段和行为隐藏在对象的每部,只给外部提供特定的访问接口
3 封装的实现
-
对属性的封装 属性的开头字母小写,只有本包才可以访问的到
-
对结构体的封装 将结构体的首字母小写
-
结构体所在的包提供一个工程模式的函数,首字母大写,类似构造函数
首字母大写的Set方法
首字母大写的Get方法
同样也有继承和多态