GoLang 基础语法(十一)

GoLang 基础语法(十一)

1.错误error

func main() {

	/*f, err := os.Open("test.txt")
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(f.Name())*/

	err1 := errors.New("自己创建的错误")
	fmt.Println(err1)
	fmt.Printf("%T\n", err1)

	err2 := fmt.Errorf("错误码%d\n", 101)
	fmt.Println(err2)
	fmt.Printf("%T\n", err2)

	fmt.Println("-----------------------")
	if err3 := CheckAge(20); err3 != nil {
		fmt.Println(err3)
		return
	} else {
		fmt.Println("年龄检测成功!")
	}

}

func CheckAge(age int) error {
	if age < 0 {
		return errors.New("年龄小于0!!!")
	}
	return nil
}

2.错误类型表示(一)

  • 使用断言将error接口转换为具体的结构体类型
func main() {
	f, err1 := os.Open("test.txt")
	if err1 != nil {
		fmt.Println(err1)
		if ins, ok := err1.(*os.PathError); ok {
			fmt.Println(ins.Err)
			fmt.Println(ins.Path)
			fmt.Println(ins.Op)
		}
		return
	}
	fmt.Println(f.Name())
}

3.错误类型表示(二)

  • 断言后调用结构体中的方法实现错误的逻辑
func main() {
	address, err := net.LookupHost("baidudddd123313dd123.com")
	if err != nil {
		if ins, ok := err.(*net.DNSError); ok {
			if ins.IsTimeout {
				fmt.Println("超时错误")
			} else if ins.IsTemporary {
				fmt.Println("临时错误")
			} else {
				fmt.Println("通常错误")
			}
		}
		return
	}
	fmt.Println(address)
}

4.错误类型表示(三)

  • 指定的类型做比较
import (
	"fmt"
	"path/filepath"
)

func main() {
	value, err := filepath.Glob("[")
	if err != nil && err == filepath.ErrBadPattern {
		return
	}
	fmt.Println(value)
}

5.自定义错误(一)

func main() {
	s, err := CircleArea(-2.23)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println("圆形的面积是:", s)
}

type AreaError struct {
	msg    string
	radius float64
}

func (a *AreaError) Error() string {
	return fmt.Sprintf("半径:%v,消息:%s\n", a.radius, a.msg)
}
func CircleArea(radius float64) (float64, error) {
	if radius < 0 {
		return 0, &AreaError{msg: "半径是非法的", radius: radius}
	}
	return math.Pi * radius * radius, nil
}

6.自定义错误(二)

func main() {
	s, err := RectArea(-3, -4)
	if err != nil {
		if ins, ok := err.(*MyAreaError); ok {
			if !ins.LengthOk() {
				fmt.Printf("error :长度:%.f,小于零\n", ins.length)
			}
			if !ins.WightOk() {
				fmt.Printf("error :宽度:%.f,小于零\n", ins.weight)
			}
		}
		return
	}
	fmt.Println(s)
}

type MyAreaError struct {
	msg    string
	length float64
	weight float64
}

func (m *MyAreaError) Error() string {
	return m.msg
}
func (m *MyAreaError) LengthOk() bool {
	return m.length > 0
}
func (m *MyAreaError) WightOk() bool {
	return m.weight > 0
}
func RectArea(length float64, weight float64) (float64, error) {
	msg := ""
	if length < 0 {
		msg = "长度小于0"
	}
	if weight < 0 {
		if msg == "" {
			msg = "宽度小于0"
		} else {
			msg += ",宽度小于0"
		}
	}
	if msg != "" {
		return 0, &MyAreaError{msg: msg, length: length, weight: weight}
	}
	return length * weight, nil
}

7.panic和recover

  • 发生panic(恐慌)之后的代码都不会继续执行
func main() {
	FuncA()
	defer MyPrint("defer main(): 3...")
	FuncB()
	defer MyPrint("defer main(): 4...")
	fmt.Println("main(): over")
}

func FuncA() {
	fmt.Println("我是一个函数FuncA......")
}

func FuncB() {
	defer func() {
		if msg := recover(); msg != nil {
			fmt.Println("FuncB 恐慌恢复了")
		}
	}()
	fmt.Println("我是一个函数FuncB......")
	defer MyPrint("defer FuncB(): 1...")
	for i := 0; i < 10; i++ {
		fmt.Println("i:", i)
		if i == 5 {
			panic("FuncB 恐慌了")
		}
	}
	defer MyPrint("defer FuncB(): 2...")
}

func MyPrint(s string) {
	fmt.Println(s)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于上面的引用内容,golang基础语法学习可以参考以下几个步骤: 1. 首先,我们需要安装golang的开发环境。你可以直接进入官网(https://go.dev/)下载并安装golang的解释器。 2. 接下来,我们可以开始学习golang语法。从上面的引用内容可以看出,golang语法和Java的结构很相似,所以如果你之前有Java编程的经验,可以借鉴一些类比来学习。但是即使你没有Java的经验,也不用担心,golang语法相对简单并且易于学习。 3. 另外,golang被称为“云计算时代的开发利器”,在使用过程中给人一种优雅、亲切、舒适的感觉。因此,在学习golang的过程中,你可能会发现它的语法设计和使用方式非常人性化。 综上所述,学习golang基础语法可以通过安装开发环境、参考Java的结构以及体验其优雅、亲切、舒适的特点来进行。希望这些信息能够帮助你开始学习golang基础语法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [一文看完golang基础语法](https://blog.csdn.net/qq_35889508/article/details/128125279)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值