Go 语言入门指南(6):基础语法和常用特性解析| 青训营

56 阅读2分钟

十八. 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方法

同样也有继承和多态