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{
  // ...
}

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

相关文章
|
1月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟蒋星熠Jaxonic,Go语言探索者。深耕云计算、微服务与并发编程,以代码为笔,在二进制星河中书写极客诗篇。分享Go核心原理、性能优化与实战架构,助力开发者掌握云原生时代利器。#Go语言 #并发编程 #性能优化
388 43
Go语言深度解析:从入门到精通的完整指南
|
1月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
161 1
|
2月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟 蒋星熠Jaxonic,执着的星际旅人,用Go语言编写代码诗篇。🚀 Go语言以简洁、高效、并发为核心,助力云计算与微服务革新。📚 本文详解Go语法、并发模型、性能优化与实战案例,助你掌握现代编程精髓。🌌 从goroutine到channel,从内存优化到高并发架构,全面解析Go的强大力量。🔧 实战构建高性能Web服务,展现Go在云原生时代的无限可能。✨ 附技术对比、最佳实践与生态全景,带你踏上Go语言的星辰征途。#Go语言 #并发编程 #云原生 #性能优化
|
3月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
287 1
|
3月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
364 0
|
3月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
236 0
|
3月前
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
213 0
|
3月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
308 0
|
9月前
|
存储 缓存 安全
Go 语言中的 Sync.Map 详解:并发安全的 Map 实现
`sync.Map` 是 Go 语言中用于并发安全操作的 Map 实现,适用于读多写少的场景。它通过两个底层 Map(`read` 和 `dirty`)实现读写分离,提供高效的读性能。主要方法包括 `Store`、`Load`、`Delete` 等。在大量写入时性能可能下降,需谨慎选择使用场景。
|
存储 负载均衡 监控
如何利用Go语言的高效性、并发支持、简洁性和跨平台性等优势,通过合理设计架构、实现负载均衡、构建容错机制、建立监控体系、优化数据存储及实施服务治理等步骤,打造稳定可靠的服务架构。
在数字化时代,构建高可靠性服务架构至关重要。本文探讨了如何利用Go语言的高效性、并发支持、简洁性和跨平台性等优势,通过合理设计架构、实现负载均衡、构建容错机制、建立监控体系、优化数据存储及实施服务治理等步骤,打造稳定可靠的服务架构。
284 1