慕课网Go-3.函数、defer、panic、recover、结构体、指针、interface

这篇具有很好参考价值的文章主要介绍了慕课网Go-3.函数、defer、panic、recover、结构体、指针、interface。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

函数

package main

import "fmt"

func add(a int, b int) (int, error) {
	return a + b, nil
}

func add2(a int, b int) (sum int, err error) {
	sum = a + b
	err = nil
	return sum, err
}

// 参数数量任意
func add3(items ...int) (sum int) {
	for _, value := range items {
		sum += value
	}
	return sum
}

//函数是一等公民,可以作为变量、参数

// 闭包:可以随时归零,而且不需要全局变量
func autoIncrement() func() int {
	local := 0
	return func() int {
		local += 1
		return local
	}
}

func main() {
	sum := add3(1, 2, 3)
	fmt.Println(sum)

	//闭包
	next := autoIncrement()
	for i := 0; i < 5; i++ {
		fmt.Print(next()) //1,2,3,4,5
	}
	fmt.Println()

	next2 := autoIncrement()
	for i := 0; i < 3; i++ {
		fmt.Print(next2()) //1,2,3
	}
}

defer

package main

import (
	"fmt"
	"sync"
)

func deferReturn() (ret int) {
	defer func() {
		ret++
	}()
	return 10
}

func main() {
	var mu sync.Mutex
	mu.Lock()
	defer mu.Unlock() //defer语句在return之前才执行

	//defer执行的顺序为栈的顺序,LIFO
	defer fmt.Println("1")
	defer fmt.Println("2")

	ret := deferReturn()
	fmt.Println(ret)//11,defer有能力改变返回值
}

panic、recover

package main

import "fmt"

func main() {

	defer func() {
		r := recover()
		if r != nil {
			fmt.Println("recover!!!")//捕获panic
		}
	}()

	panic("panic!!!") //直接导致程序退出
	fmt.Println("1")
}

结构体

package main

import "fmt"

type Person struct {
	name    string
	age     int
	address string
	height  float32
}

func (p Person) print() {
	fmt.Printf("name:%s, age:%d", p.name, p.age)
	fmt.Println()
}

type Student struct {
	p     Person
	score float32
}

type Student2 struct {
	Person
	score float32
}

func main() {
	type myInt2 = int //类型别名
	type myInt int    //自定义类型,不可加法,可扩展

	//初始化
	p1 := Person{"neo", 18, "mooc", 1.80}
	p2 := Person{
		name:    "harry",
		address: "beijing",
	}
	var p3 Person
	p3.age = 20
	p3.print()

	//匿名结构体:一次性
	address := struct {
		province string
		city     string
	}{
		province: "beijing1",
		city:     "beijing2",
	}
	fmt.Println(address)

	//结构数组
	pp3 := []Person{
		{name: "potter"},
		{name: "peter"},
	}
	fmt.Println(p1)
	fmt.Println(p2)
	fmt.Println(pp3)

	//嵌套结构体
	s := Student{Person{name: "neo", age: 18}, 99}
	s.p.height = 1.80

	s1 := Student{}
	s1.p.name = "neo"

	s2 := Student2{}
	s2.name = "neo"
}

指针

package main

import "fmt"

type Person2 struct {
	name string
}

func main() {
	po := &Person2{
		name: "neo",
	}
	//以下在go中等效
	po.name = "leo"
	(*po).name = "neo"

	//初始化
	var pp = new(Person2)
	fmt.Println(pp.name)

	//nil的用法
	var m1 map[string]string
	var m2 = make(map[string]string, 0)
	//m1["name"] = "harry"  //报错
	m2["name"] = "potter" //不报错,建议用make
	for key, value := range m1 {
		fmt.Println(key, value)
	}
	for key, value := range m2 {
		fmt.Println(key, value)
	}
}

interface

定义

package main

import "fmt"

// 接口定义
type Duck interface {
	Gaga()
	Walk()
	Swim()
}

// 自定义类用于接口实现
type pskDuck struct {
	legs int
}

func (pd *pskDuck) Gaga() {
	fmt.Println("Gaga")
}

func (pd *pskDuck) Walk() {
	fmt.Println("walking")
}

func (pd *pskDuck) Swim() {
	fmt.Println("swim")
}

func main() {
	var d Duck = &pskDuck{}
	d.Walk()
}

多接口

package main

import "fmt"

type MyWriter interface {
	Write(string) error
}
type MyCloser interface {
	Close() error
}

type fileWriter struct {
	filepath string
}
type databaseWriter struct {
	host string
	port string
}
type writeCloser struct {
	MyWriter
}

func (fw *fileWriter) Write(string) error {
	fmt.Println("write string to error")
	return nil
}
func (dw *databaseWriter) Write(string) error {
	fmt.Println("write string to database")
	return nil
}
func (wc *writeCloser) Close() error {
	fmt.Println("close")
	return nil
}

func main() {
	var mw MyWriter = &writeCloser{
		&databaseWriter{},
	}
	mw.Write("harry")
}

断言

package main

import (
	"fmt"
	"strings"
)

func add(a, b interface{}) interface{} {
	switch a.(type) {`package main

import "fmt"

type MyInterWriter interface {
	Write(string)
}
type MyInterReader interface {
	Read() string
}
type MyReadWriter interface {
	MyInterReader
	MyInterWriter
	ReadWrite()
}
type SreadWriter struct {
}

func (s *SreadWriter) Read() string {
	fmt.Println("Read")
	return ""
}

func (s *SreadWriter) Write(s2 string) {
	fmt.Println("Write")
}

func (s *SreadWriter) ReadWrite() {
	fmt.Println("ReadWrite")
}

func main() {
	var mrw MyReadWriter = &SreadWriter{}
	mrw.Read()
}
`
	case int:
		ai, _ := a.(int)
		bi, _ := b.(int)
		return ai + bi
	case float64:
		af, _ := a.(float64)
		bf, _ := b.(float64)
		return af + bf
	case string:
		as, _ := a.(string)
		bs, _ := b.(string)
		return as + bs
	default:
		panic("not supported type")
	}
}

func main() {
	re := add("hello", "world")
	res, _ := re.(string)
	strings.Split(res, " ")
	fmt.Println(re)
}

嵌套接口

文章来源地址https://www.toymoban.com/news/detail-614335.html

到了这里,关于慕课网Go-3.函数、defer、panic、recover、结构体、指针、interface的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Go 语言 panic 和 recover 详解

    panic()  和  recover()  是 Go 语言中用于处理错误的两个重要函数。 panic()  函数用于中止程序并引发panic,而  recover()  函数用于捕获panic并恢复程序的执行。 panic()  函数用于中止程序并引发panic。 panic()  函数可以接收一个参数,该参数将作为panic的原因。 当发生panic时,程序

    2024年02月02日
    浏览(35)
  • Go异常处理机制panic和recover

    使用panic抛出异常后, 将立即停止当前函数的执行并运行所有被defer的函数,然后将panic抛向上一层,直至程序crash。但是也可以使用被defer的recover函数来捕获异常阻止程序的崩溃,recover只有被defer后才是有意义的。 结果: 使用recover()捕获异常: 结果为: 如果有两个recover,则捕获异

    2024年02月13日
    浏览(25)
  • 慕课网 Go工程师 第三周 package和gomodules章节

     包名前面加匿名,只引入但不使用,如果对应包有init函数,会执行init函数(初始化操作) 包名前面加. 把这个包的结构体和方法导入当前包,慎用,你不知道当前包和被引入的包用没有重名的结构体或者方法。  包名前面 起一个别名 go.mod 自动管理依赖包,不需要我们管理

    2024年02月11日
    浏览(30)
  • 【Go 基础篇】Go语言中的defer和recover:优雅处理错误

    Go语言以其简洁、高效和强大的特性受到了开发者的热烈欢迎。在错误处理方面,Go语言提供了一种优雅的机制,即通过 defer 和 recover 组合来处理恐慌(panic)错误。本文将详细介绍Go语言中的 defer 和 recover 机制,探讨其工作原理和在实际开发中的应用。 在软件开发过程中,

    2024年02月10日
    浏览(29)
  • Go语言之函数补充defer语句,递归函数,章节练习

    defer语句是go语言提供的一种用于注册延迟调用的机制,是go语言中一种很有用的特性。 defer语句注册了一个函数调用,这个调用会延迟到defer语句所在的函数执行完毕后执行,所谓执行完毕是指该函数执行了return语句、函数体已执行完最后一条语句或函数所在协程发生了恐慌

    2024年02月17日
    浏览(32)
  • web前端自学全套视频,学习慕课网 vue-cli3安装,cube-ui安装,前端面试自我介绍

    https://github.com/cube-ui/cube-template/wiki 2019.2.25 1 tab点击切换导航栏: http://ustbhuangyi.com/music/#/rank vue-cli2.9.6 中使用cube-ui注意事项 https://didi.github.io/cube-ui/#/zh-CN/docs/quick-start 淘宝源 使用 cnpm -v 查看是否已经安装 cnpm。如果没有,使用 npm install cnpm -g --registry=https://registry.npm.taobao.or

    2024年04月26日
    浏览(21)
  • Go语言入门记录:从基础到变量、函数、控制语句、包引用、interface、panic、go协程、Channel、sync下的waitGroup和Once等

    程序入口文件的包名必须是main,但主程序文件所在文件夹名称不必须是 main ,即我们下图 hello_world.go 在 main 中,所以感觉 package main 写顺理成章,但是如果我们把 main 目录名称改成随便的名字如 filename 也是可以运行的,所以迷思就在于写在文件开头的那个 package main 和 java

    2024年02月11日
    浏览(24)
  • GO——recover

    定义 panic 改变程序控制流 立即停止当前函数剩余代码,调用defer 只会执行当前协程的defer recover 可以终止panic造成的程序崩溃 只能在defer中发挥作用 输出

    2024年01月25日
    浏览(25)
  • Go语言进阶:函数、指针、错误处理

    函数是基本的代码块,用于执行一个任务。 Go 语言最少有个 main() 函数。 你可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务。 函数声明包括函数名﹑形式参数列表﹑返回值列表(可省略)以及函数体。 形式参数列表描逑了函数的参数名以及参数类型。这

    2024年02月12日
    浏览(25)
  • Go语言之流指针类型,new函数

    计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用 4 个字节。为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号、身份证号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。 我们将内存中字节的

    2024年02月16日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包