Go 语言入门指南(三) 青训营

简介: Go 语言入门指南(三) 青训营

Go 语言入门指南(三) 青训营

这篇博客继续对go的基础语法进行整理。主要包括:接口、文件操作。

一、接口

接口也有点不好理解,首先注意:==接口是一种类型----抽象类型。==有点像C++的模板类型!底层分为动态类型和动态值两部分。

接口类型对行为(方法)做约束。就像是一种协议、一种规则约束。

不同的类有一个相似的方法,就可以屏蔽类的差异,以这个方法为约束构造一个新的类型---interface

同一个类可能属于多个interface。另外interface 也可以嵌套使用。

看下面的例子:

// 在函数传参时就可以使用speaker这个类型来当形参
// 实参可以是实现了speak方法的任意类
type speaker interface{
  // 具体的方法声明,所有有这些方法的类都可以通过speaker这个interface来统一
  speak()
  // ...
}
// cat类有speak这个方法
type cat struct{
  name string
}
func (c cat)speak(){
  // ...
}
// dog类有speak这个方法
type dog struct{
  name string
}
func (d dog)speak(){
  // ...
}
// pig类有speak这个方法
type pig struct{
  name string
}
func (p pig)speak(){
  // ...
}
func amimalSpeak(x speaker){
  x.speak()
}
func main(){
  c := cat{name: "aaa"}
  d := dog{name: "sss"}
  p := pig{name: "ddd"}
  // 实参可以是实现了speak方法的任何类
  amimalSpeak(c)
  amimalSpeak(p)
  amimalSpeak(d)
  // 可以直接赋值!speaker就是抽象类型
  var am speaker 
  fmt.Printf("%T\n", am)  // nil
  // am 有动态类型和动态值
  am = c
  fmt.Printf("%T\n", am)  // main.cat
  am = d 
  fmt.Printf("%T\n", am)  // main.dog
  am = p
  fmt.Printf("%T\n", am)  // main.pig
}
1. 使用值接收者和使用指针接收者的区别

实现值接收者的类可以赋值给interface类型,实现值接收者的类的指针也可以赋值给interface类型。

但是实现指针接收者的类想要赋值给interface类型,必须取地址。(常用)

2. 空接口

应用:函数形参(可以接收任意类型的变量)

mapvalue类型

看下面例子:

// 接口里没有任何约束,也就是任何类型都可以传给空接口
// fmt.Println() 的形参就是典型的空接口
interface{}  // 这个就是空接口类型
// 这个map的value可以是任意类型
var m map[string]interface{}
m = make(map[string]interface{}, 10)
m["aaa"] = "111"
m["sss"] = 1
m["ddd"] = []int{1,2,3}
// 可以接收任意类型的变量
func show(a interface{}){
}

二、文件操作

所有的文件操作其实都是对底层操作系统的文件操作做了封装,所以只需要会用那些封装的接口就可以了,go的文件操作主要有三个包:osbufioioutil。下面是简单的接口用法。

打开文件:

// *os.File
func Open(name string) (file *File, err error)
// flag标记:O_WRONLY/O_RDONLY...和底层的一样; FileMode:文件权限
func OpenFile(name string, flag int, perm FileMode) (file *File, err error)

读的操作:

func main(){
  // Open:只读的方式打开文件
  file,err := os.Open("./test.txt")
  if err != nil{
    fmt.Printf("open file test.txt error:%v\n", nil)
    return
  }
  // 关闭文件描述符,并设置成defer,这也是defer的应用场景
  // 在判断完err后写这个关闭!!
  defer file.Close()
  // 读取文件方法一
  tmp := make([]byte, 128)
  // 读到tmp里,返回值n表示实际读到的字节数
  n,err := file.Read(tmp)
  if err != nil{
    // ...
  } 
  // 读取文件方法二  使用bufio包(基于缓冲区)
  reader := bufio.NewReader(file)
  // reader里有很多读取方法
  line,err := reader.ReadString('\n') // 一次读一行,读到line中
  if err == os.EOF{ 
    // ...
    return
  }
  if err != nil{
    // ...
  }  
  // 读取文件方法三  使用ioutil包
  // 不用打开文件,直接读取,函数里肯定还是打开和关闭文件了
  // 直接读取到文件末尾!也就是读取所有内容
  ret,err := ioutil.ReadFile("./xxx.txt")
  if err != nil{
    // ...
  }  
}

写的操作:

file,err := os.OpenFile("./xxx.txt",os.O_CREATE|os.O_WRONLY|os.TRUNC,   0644)
if err != nil{
 // ...
}
// 一定是在判断完nil后defer关闭
defer file.Close()
// 写入方法一
file.Write([]byte("ssss"))
file.WriteString("sdfsasasa")
// 写入方法二  使用bufio包
writer := bufio.NewWriter(file)
writer.WriteString("sasa")  // 写到缓存里
writer.Flush()              // 刷新缓冲区!!
// 写入方法三  使用ioutil包(基于缓冲区)
// 不用打开文件,直接写入,函数里肯定还是打开和关闭文件了
err := ioutil.WriteFile("./xx.txt", []byte("asdsa"), 0666)
if err != nil{
  // ...
}

这篇博客就总结到这里吧。

相关文章
|
10天前
|
存储 Go 索引
go语言使用for循环遍历
go语言使用for循环遍历
24 7
|
13天前
|
存储 Go
go语言 遍历映射(map)
go语言 遍历映射(map)
25 2
|
14天前
|
Go 调度 开发者
Go语言中的并发编程:深入理解goroutines和channels####
本文旨在探讨Go语言中并发编程的核心概念——goroutines和channels。通过分析它们的工作原理、使用场景以及最佳实践,帮助开发者更好地理解和运用这两种强大的工具来构建高效、可扩展的应用程序。文章还将涵盖一些常见的陷阱和解决方案,以确保在实际应用中能够避免潜在的问题。 ####
|
14天前
|
测试技术 Go 索引
go语言使用 range 关键字遍历
go语言使用 range 关键字遍历
17 3
|
14天前
|
测试技术 Go 索引
go语言通过 for 循环遍历
go语言通过 for 循环遍历
24 3
|
16天前
|
安全 Go 数据处理
Go语言中的并发编程:掌握goroutine和channel的艺术####
本文深入探讨了Go语言在并发编程领域的核心概念——goroutine与channel。不同于传统的单线程执行模式,Go通过轻量级的goroutine实现了高效的并发处理,而channel作为goroutines之间通信的桥梁,确保了数据传递的安全性与高效性。文章首先简述了goroutine的基本特性及其创建方法,随后详细解析了channel的类型、操作以及它们如何协同工作以构建健壮的并发应用。此外,还介绍了select语句在多路复用中的应用,以及如何利用WaitGroup等待一组goroutine完成。最后,通过一个实际案例展示了如何在Go中设计并实现一个简单的并发程序,旨在帮助读者理解并掌
|
15天前
|
Go 索引
go语言按字符(Rune)遍历
go语言按字符(Rune)遍历
24 3
|
25天前
|
存储 JSON 监控
Viper,一个Go语言配置管理神器!
Viper 是一个功能强大的 Go 语言配置管理库,支持从多种来源读取配置,包括文件、环境变量、远程配置中心等。本文详细介绍了 Viper 的核心特性和使用方法,包括从本地 YAML 文件和 Consul 远程配置中心读取配置的示例。Viper 的多来源配置、动态配置和轻松集成特性使其成为管理复杂应用配置的理想选择。
40 2
|
24天前
|
Go 索引
go语言中的循环语句
【11月更文挑战第4天】
26 2
|
24天前
|
Go C++
go语言中的条件语句
【11月更文挑战第4天】
34 2