go初识
- 接口断言
方式一:
1.instance :=接口对象.(实际类型)//不安全,会panic()
2.instance, ok :=接口对象.(实际类型)//安全
方式二:switch
switch instance:=接口对象.(type){
case 实际类型1:
...
case 实际类型2:
...
}
例:
package main
import (
"fmt"
"math"
)
func main() {
var t1 Triangle = Triangle{3, 4, 5}
fmt.Println(t1.peri())
fmt.Println(t1.area())
fmt.Println(t1.a, t1.b, t1.c)
var c1 Circle = Circle{4}
fmt.Println(c1.peri())
fmt.Println(c1.area())
fmt.Println(c1.radius)
var s1 Shape
s1 = t1
fmt.Println(s1.peri())
fmt.Println(s1.area())
var s2 Shape
s2 = c1
fmt.Println(s2.peri())
fmt.Println(s2.area())
getType(t1)
getType(c1)
getType(s1)
getType2(t1)
getType2(c1)
getType2(s1)
}
// 1.定义一个接口
type Shape interface {
peri() float64 //形状的周长
area() float64 //形状的面积
}
// 2.定义实现类:三角形
type Triangle struct {
a, b, c float64
}
func (t Triangle) peri() float64 {
return t.a + t.b + t.c
}
func (t Triangle) area() float64 {
p := t.peri() / 2
s := math.Sqrt(p*(p-t.a)*(p-t.b) + (p - t.c))
return s
}
type Circle struct {
radius float64
}
func (c Circle) peri() float64 {
return c.radius * 2 * math.Pi
}
func (c Circle) area() float64 {
return math.Pow(c.radius, 2) * math.Pi
}
func getType(s Shape) {
//断言
if ins, ok := s.(Triangle); ok {
fmt.Println("是三角形,三条边是:", ins.a, ins.b, ins.c)
} else if ins, ok := s.(Circle); ok {
fmt.Println("是圆形,半径是:", ins.radius)
} else {
fmt.Println("我也不知道了。。。")
}
}
func getType2(s Shape) {
switch ins := s.(type) {
case Triangle:
fmt.Println("三角形。。。", ins.a, ins.b, ins.c)
case Circle:
fmt.Println("圆形。。。", ins.radius)
}
}
12
6.082762530298219
3 4 5
25.132741228718345
50.26548245743669
4
12
6.082762530298219
25.132741228718345
50.26548245743669
是三角形,三条边是: 3 4 5
是圆形,半径是: 4
是三角形,三条边是: 3 4 5
三角形。。。 3 4 5
圆形。。。 4
三角形。。。 3 4 5
- type
用于类型定义和类型别名
1.类型定义:type 类型名 Type
2.类型别名:type 类型名 =Type
- os包
package main
import (
"fmt"
"os"
)
func main() {
f, err := os.Open("test.txt")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(f.Name(), "opened")
}
test.txt opened
- panic()和recover()
panic(),让当前程序进入恐慌,中断程序进行
recover(),让程序恢复,必须在defer函数执行
- init()函数和main()函数
1.init()用于初始化信息,main()作为程序入口
2.不能有参数,返回值。只能由go程序自动调用,不能被引用
3.init()函数可以定义在任意的包里,可以多个,main()只能在main包下,而且只有一个
4.执行顺序
A:先执行init()区 后执行main()函数
B:对于同一个go文中调用顺序是从上到下的,也就是说,先写的先被执行,后写的后被执行
C:对于同一个包下,将文件名按照字符串进行排序,之后顺序调用各个文件中init()函数
D:对于不同包下,如果不存在依赖。按照main包中import的顺序来调用对应包中init()函数如果存在依赖,最后被依赖的最先被初始化
导入顺序:main->A-->B-->C
执行顺序:C->B->A-->main
5.存在依赖的包之间,不能循环导入
6.一个包可以被其他多个包import,但是只能被初始化一次
- time包
time.Now()
- Fileinfo接口
- 文件打开操作
O_RDONLY int = syscall.O_RDONLY// 只读模式打开文件
O_WRONLY int = syscall.O_WRONLY //只写模式打开文件
O_RDWR int= syscall.O_RDWR //读写模式打开文件
O_APPEND int= syscall.0_APPEND// 写操作时将数据附加到文件尾部
O_CREATE int =syscall.0_CREAT //如果不存在将创建一个新文件
O_EXCL int = syscall.0_EXCL// 和O_CREATE配合使用,文件必须不存在
O_SYNC int = syscall.0_SYNC //打开文件用于同步I/0
O_TRUNC int = syscall.0_TRUNC //如果可能,打开时清空文件
- File操作
- io包