包的话我感觉没啥可说的,需要注意的是比如有两个包,一个main一个func包,如果func包的函数或变量名开头小写,其他包是无法访问这个函数或者变量的。
go语言包如果不使用的话会报错,所以会自动删除不使用的包
接口类型就像是一种约定——概括了一种类型应该具备哪些方法,在Go语言中提倡使用面向接口的编程方式实现解耦。
接口是一种由程序员来定义的类型,一个接口类型就是一组方法的集合,它规定了需要实现的所有方法。
相较于使用结构体类型,当我们使用接口类型说明相比于它是什么更关心它能做什么。
接口定义格式:
type 接口类型名 interface{
方法名( 参数列表 ) 返回值列表
}
接口简单使用体会
package main
import 'fmt'
type Dog struct {
name string
age int
}
type Cat struct {
name string
age int
}
func (dog Dog) Say() {
fmt.Printf('dog name =%s,age = %d
', dog.name, dog.age)
}
func (cat Cat) Say() {
fmt.Printf('cat name =%s,age = %d
', cat.name, cat.age)
fmt.Println('小梨花爱上了阿拉斯加')
}
//定义了一个接口,不管你什么类型,它只管实现了什么方法
//定义一个类型,一个抽象的类型,只要实现了say方法的类型都可以称为animalSay类型
type animalSay interface {
Say()
}
func do(a animalSay) {
//不管传进来的是什么,就会执行他的Say方法
a.Say()
}
func main() {
mainDog := Dog{
name: '阿拉斯加',
age: 100,
}
mainCat := Cat{
name: '小梨花',
age: 44,
}
do(mainDog)
do(mainCat)
}
Operationresults:dogname=阿拉斯加,age=100catname=小梨花,age=44小梨花爱上了阿拉斯加
空接口
空接口常用的两种场景:
使用空接口实现可以接收任意类型的函数参数。使用空接口实现可以保存任意值的字典。
package main
import 'fmt'
//空接口
//接口中没有定义任何需要实现的方法时,该接口就是一个空接口
//任意类型都实现了空接口 --> 空接口变量可以存储任意值!
//空接口一般不需要提前定义
type dsoihfiosdfhns interface {
}
//空接口的应用
//1.空接口类型作为函数的参数
//2.空
func main() {
var x interface{}
x = 'hello'
fmt.Println(x)
x = 100
fmt.Println(x)
x = true
fmt.Println(x)
}
接口底层原理
由于接口类型的值可以是任意一个实现了该接口的类型值,所以接口值除了需要记录具体值之外,还需要记录这个值属于的类型。也就是说接口值由“类型”和“值”组成,鉴于这两部分会根据存入值的不同而发生变化,我们称之为接口的动态类型和动态值。
类型断言
简单使用
判断这个接口的值到底是什么类型的,相当于在猜这个接口什么类型。
package main
import 'fmt'
func main() {
var x interface{}
x = true
ret := x.(bool)
fmt.Println('猜对了', ret)
nret := x.(int)
fmt.Println('猜错了', nret)
}
断言状态判断
如果按上例那样,会导致程序退出,断言可返回一个布尔类型状态,猜对了为true,猜错了false
package main
import 'fmt'
func main() {
var x interface{}
x = true
ret, Rstate := x.(bool)
if Rstate == true {
fmt.Println('猜对了,值为', ret)
} else {
fmt.Println('猜错了')
}
}
Operationresults:猜对了,值为true
断言配合switch
package main
import 'fmt'
func main() {
var x interface{}
x = 100
switch v := x.(type) {
case string:
fmt.Println('该接口为string类型值为', v)
case bool:
fmt.Println('该接口为bool类型值为', v)
case int:
fmt.Println('该接口为int类型值为', v)
}
}
Operationresults:该接口为int类型值为100
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点