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

函数

package mainimport "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 + berr = nilreturn sum, err
}// 参数数量任意
func add3(items ...int) (sum int) {for _, value := range items {sum += value}return sum
}//函数是一等公民,可以作为变量、参数// 闭包:可以随时归零,而且不需要全局变量
func autoIncrement() func() int {local := 0return func() int {local += 1return 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 mainimport ("fmt""sync"
)func deferReturn() (ret int) {defer func() {ret++}()return 10
}func main() {var mu sync.Mutexmu.Lock()defer mu.Unlock() //defer语句在return之前才执行//defer执行的顺序为栈的顺序,LIFOdefer fmt.Println("1")defer fmt.Println("2")ret := deferReturn()fmt.Println(ret)//11,defer有能力改变返回值
}

panic、recover

package mainimport "fmt"func main() {defer func() {r := recover()if r != nil {fmt.Println("recover!!!")//捕获panic}}()panic("panic!!!") //直接导致程序退出fmt.Println("1")
}

结构体

package mainimport "fmt"type Person struct {name    stringage     intaddress stringheight  float32
}func (p Person) print() {fmt.Printf("name:%s, age:%d", p.name, p.age)fmt.Println()
}type Student struct {p     Personscore float32
}type Student2 struct {Personscore float32
}func main() {type myInt2 = int //类型别名type myInt int    //自定义类型,不可加法,可扩展//初始化p1 := Person{"neo", 18, "mooc", 1.80}p2 := Person{name:    "harry",address: "beijing",}var p3 Personp3.age = 20p3.print()//匿名结构体:一次性address := struct {province stringcity     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.80s1 := Student{}s1.p.name = "neo"s2 := Student2{}s2.name = "neo"
}

指针

package mainimport "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]stringvar m2 = make(map[string]string, 0)//m1["name"] = "harry"  //报错m2["name"] = "potter" //不报错,建议用makefor key, value := range m1 {fmt.Println(key, value)}for key, value := range m2 {fmt.Println(key, value)}
}

interface

定义

package mainimport "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 mainimport "fmt"type MyWriter interface {Write(string) error
}
type MyCloser interface {Close() error
}type fileWriter struct {filepath string
}
type databaseWriter struct {host stringport 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 mainimport ("fmt""strings"
)func add(a, b interface{}) interface{} {switch a.(type) {`package mainimport "fmt"type MyInterWriter interface {Write(string)
}
type MyInterReader interface {Read() string
}
type MyReadWriter interface {MyInterReaderMyInterWriterReadWrite()
}
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 + bicase float64:af, _ := a.(float64)bf, _ := b.(float64)return af + bfcase string:as, _ := a.(string)bs, _ := b.(string)return as + bsdefault:panic("not supported type")}
}func main() {re := add("hello", "world")res, _ := re.(string)strings.Split(res, " ")fmt.Println(re)
}

嵌套接口

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/11043.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

注解和反射02--Java反射

反射 动态和静态语言获取反射对象Java反射机制提供的功能Java反射优缺点反射相关的主要API 动态和静态语言 要学习反射&#xff0c;首先我们需要了解一下静态和动态语言。 动态语言&#xff1a;是一类在运行时可以改变其结构的语言&#xff1a;例如新的函数、对象、甚至代码可…

Tomcat调优1

Tomcat调优的具体应用场景和案例可以考虑这些方面: 高并发场景 增加最大线程数,推荐设置为200-500左右。 优化线程池参数,增大工作队列容量防止请求排队。 使用NIO连接器,提高连接处理效率。 适当增大最大连接数,根据硬件设定为2000-4000。 大流量场景 适当调大Tomcat及J…

C语言习题练习

C语言习题练习 一、offsetof宏二、交换奇偶位三、原地移除数组总结 一、offsetof宏 首先我们要了解什么是offsetof宏&#xff1a; . 此具有函数形式的宏返回数据结构或联合类型中成员成员的偏移值&#xff08;以字节为单位&#xff09;。 . 返回的值是size_t类型的无符号整数…

Is Mapping Necessary for Realistic PointGoal Navigation 论文阅读和代码分析

论文 论文信息 题目&#xff1a;Is Mapping Necessary for Realistic PointGoal Navigation? 作者&#xff1a;Ruslan Partsey、 Erik Wijmans 代码地址&#xff1a;rpartsey.github.io/pointgoalnav 来源&#xff1a;CVPR Abstract 目标&#xff1a;证明显式地图不是成功…

【数据结构】实验九:二叉树

实验九 二叉树 一、实验目的与要求 1&#xff09;理解二叉树的类型定义&#xff1b; 2&#xff09;掌握二叉树的存储方式及基于存储结构的基本操作实现&#xff1b; 二、 实验内容 1. 二叉树的结点定义如下&#xff1a; struct TreeNode { int m_nvalue; TreeNode* m_…

多源BFS-- 矩阵距离

关于多源BFS&#xff0c;基本上就是单源BFS的简单升级了一下&#xff0c;比如在queue中队头开始时只有一个&#xff0c;我们通过这一个队头去推导其他的东西。而多源最短路就是队头一开始有1-n个可能的数&#xff0c;一个一个去BFS。 题目思路&#xff1a; 这个题就直接把所有的…

分享69个Java源码,总有一款适合您

Java源码 分享69个Java源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c;大家下载后可以看到。 源码下载链接&#xff1a; https://pan.baidu.com/s/1ZgbJhMNwIyFyqFzHsDdL5w 提取码&a…

excel添加列匹配对比及标签生成(留存)

import pandas as pd import numpy as np import os from datetime import date,datetime todaydate.today()downpath/Users/kangyongqing/Downloads/ gensuipath/Users/kangyongqing/Documents/kangyq/202209/OKR预占/2023Q2促留存/月度留存分级/24样本学生跟随.xlsxdownname1…

WPF实战学习笔记17-TodoView 添加新增、编辑、查询功能

文章目录 TodoView 添加新增、编辑、查询功能修改TodoViewModel.cs修改XAML修改ToDoService TodoView 添加新增、编辑、查询功能 修改TodoViewModel.cs using Mytodo.Common.Models; using Mytodo.Service; using Prism.Commands; using Prism.Ioc; using Prism.Mvvm; using …

WebSocket心跳机制(笔记大全)

一、WebSocket心跳机制前端 前端实现WebSocket心跳机制的方式主要有两种&#xff1a; 使用setInterval定时发送心跳包。在前端监听到WebSocket的onclose()事件时&#xff0c;重新创建WebSocket连接。 第一种方式会对服务器造成很大的压力&#xff0c;因为即使WebSocket连接正…

HummerRisk V1.3.0 发布

HummerRisk V1.3.0发布&#xff1a; 大家好&#xff0c;HummerRisk 1.3.0和大家见面了&#xff0c;在这个版本中我们继续在多云接入管理、多云检测方式、云资源态势方面提供新的能力&#xff0c;并增加了新的镜像仓库支持类型&#xff0c;并优化了云的区域选择、优化规则组内容…

C#时间轴曲线图形编辑器开发1-基本功能

目录 一、前言 1、简介 2、开发过程 3、工程下载链接 二、基本功能实现 1、绘图面板创建 &#xff08;1&#xff09;界面布置 &#xff08;2&#xff09;显示面板代码 &#xff08;3&#xff09; 面板水平方向、竖直方向移动功能实现 &#xff08;4&#xff09;面板放…

【数据结构】实验五:栈

实验五 栈 一、实验目的与要求 1&#xff09;熟悉栈的类型定义和基本操作&#xff1b; 2&#xff09;灵活应用栈解决具体应用问题。 二、实验内容 1、判断回文数&#xff0c;回文是指正读反读均相同的字符序列&#xff0c;如“1221”和“12321”均是回文&#xff0c;但“…

与传统透明屏相比,BOE透明屏有哪些特点优势?

BOE透明屏是一种新型的显示技术&#xff0c;它能够实现透明度高达90%以上的显示效果。这种屏幕可以应用于各种领域&#xff0c;如商业展示、智能家居、汽车行业等&#xff0c;具有广阔的市场前景。 BOE透明屏采用了先进的光学技术&#xff0c;通过控制光的传播和折射&#xff…

自建纯内网iot平台服务,软硬件服务器全栈实践

基于以下几个考虑&#xff0c;自制硬件设备&#xff0c;mqtt内网服务器。 1.米家app不稳定&#xff0c;逻辑在云端或xiaomi中枢网关只支持少部分在本地计算。 2.监控homeassistant官方服务有大量数据交互。可能与hass安装小米账户有关。 3.硬件&#xff1a;原理图&#xff0c;l…

linux信号介绍

信号介绍 信号的概念 信号是信息的载体&#xff0c;Linux/UNIX 环境下&#xff0c;古老、经典的通信方式&#xff0c; 现下依然是主要的通信手段。 信号在我们的生活中随处可见&#xff0c;例如&#xff1a; 古代战争中摔杯为号&#xff1b; 现代战争中的信号弹&#x…

【KVC补充 Objective-C语言】

一、KVC补充 好,那么接下来,再给大家说一下这个KVC 1.首先我们说,这个KVC,就是指的什么 key value coding 吧 全称就是叫做(Key Value Coding),这是它的全称 那么,你在帮助文档里面搜的时候,你就搜key-value coding 是不是这个啊,key-value coding 然后点击,进…

Unity XML3——XML序列化

一、XML 序列化 ​ 序列化&#xff1a;把对象转化为可传输的字节序列过程称为序列化&#xff0c;就是把想要存储的内容转换为字节序列用于存储或传递 ​ 反序列化&#xff1a;把字节序列还原为对象的过程称为反序列化&#xff0c;就是把存储或收到的字节序列信息解析读取出来…

尚医通06:数据字典+EasyExcel+mongodb

内容介绍 1、数据字典列表前端 2、EasyExcel介绍、实例 3、数据字典导出接口、前端 4、数据字典导入接口、前端 5、数据字典添加redis缓存 6、MongoDB简介 7、MongoDB安装 8、MongoDB基本概念 数据字典列表前端 1、测试问题 &#xff08;1&#xff09;报错日志 &am…

SpringBoot复习:(4)打成的jar包是如何启动的?

jar包通过MANIFEST的Main-Class指定了主类JarLauncher, JarLauncher的main方法代码如下&#xff1a; 其中调用的launch的代码如下&#xff1a; 首先&#xff0c;创建了一个自定义的ClassLoader,代码如下&#xff1a; 其中调用的重载的createClassLoader代码如下&#xff1…