学习记录周报2

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包

 

 

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值