1. reflect.ValueOf(f).Call()方法

可以用来执行一个方法

var f interface{} = testFunction
func main() {if f != nil {//执行f方法res := reflect.ValueOf(f).Call([]reflect.Value{reflect.ValueOf(1), reflect.ValueOf(2), reflect.ValueOf(3)})//显示结果for _, r := range res {fmt.Printf("%v ", r)}fmt.Println()}
}func testFunction(a, b, c int) (int, string){return a+b+c, fmt.Sprintf("%d%d%d", a, b, c)
}

可以写一个工具方法,把某方法a及参数b(interface类型)传到这个工具方法来执行这个a方法。

var f interface{} = testFunctionfunc main() {if f != nil {//执行f方法executeUnknownFunc(f, 1, 2, 3)}
}func executeUnknownFunc(f interface{}, p1, p2, p3 interface{}) {res := reflect.ValueOf(f).Call([]reflect.Value{reflect.ValueOf(p1),reflect.ValueOf(p2),reflect.ValueOf(p3)})//显示结果for _, r := range res {fmt.Printf("%v ", r)}
}func testFunction(a, b, c int) (int, string) {return a + b + c, fmt.Sprintf("%d%d%d", a, b, c)
}

2. interface

声明一个接口及其方法,然后在另一个公共方法里把这个接口传进去,调用接口的方法。这样当传进去不同的结构体(j继承了上面的那个接口)时,就会产生不同效果。
例如下面:Apple和Nokia实现了Phone接口,Caller方法的参数为Phone接口。Caller里可以把Apple和Nokia的实例传进去。

type Phone interface {call()message()
}type Apple struct {brand string
}func (a *Apple) call() {fmt.Printf("%s is calling\n", a.brand)
}func (a *Apple) message() {fmt.Printf("%s is sending message\n", a.brand)
}type Nokia struct {}func (a *Nokia) call() {fmt.Println("nokia is calling")
}func (a *Nokia) message() {fmt.Println("nokia is sending message")
}func Caller(p Phone) {p.call()p.message()
}func main() {apple := &Apple{brand: "apple"}nokia := &Nokia{}Caller(apple)Caller(nokia)
}

3. context的用处

context携带了任务截至时间(Deadline()),取消信号(Done())以及在API边界处的数值(Value())。
向一个服务器发起请求,应该创建一个context;当有来自外部的调用时候,应该接受context。方法调用链应该也传递context。当一个context取消了,所有派生于它的context也会被取消。

参考链接

一种应用:当请求第三方服务时,可以使用context做响应超时处理

func test11() {testContext("https://www.baidu.com", 500)testContext("https://www.google.com", 3000)
}func testContext(url string, duration time.Duration) {ctx, cancel := context.WithTimeout(context.TODO(), duration*time.Millisecond)ctx = newContextWithValue(ctx, "haha", "hehe")defer cancel()ch := make(chan *httpResponse)go httpClientWithContext(ctx, url, ch)for {select {case <-ctx.Done():fmt.Println("context value is--->", getContextValue(ctx, "haha"))fmt.Println("context error is--->", ctx.Err())returncase rsp := <-ch:fmt.Println("response is--->", rsp.rsp, rsp.err)return}}
}type httpResponse struct {rsp *http.Responseerr error
}func httpClientWithContext(ctx context.Context, url string, ch chan *httpResponse) {req, err := http.NewRequestWithContext(ctx, "get", url, nil)if err != nil {fmt.Println(err)return}rsp, err := http.DefaultClient.Do(req)ch <- &httpResponse{rsp: rsp,err: err,}
}func newContextWithValue(ctx context.Context, k, v interface{}) context.Context {return context.WithValue(ctx, k, v)
}func getContextValue(ctx context.Context, k interface{}) interface{} {return ctx.Value(k)
}

4. 方法中传递切片

在做一道leetcode关于回溯法的题目时,把切片放在了参数处,导致结果不正确,不应该把切片作为参数,而应该作为方法内部可以访问到的变量。
为什么:切片的底层是一个指向了一个数组的指针,和表示长度和容量的数值组成。再想想。。。

func combinationSum(candidates []int, target int) [][]int {sort.Ints(candidates)//不作为方法参数var res [][]intvar tmp [] intvar backtrack func(int, int)backtrack = func(i, sum int){if sum == target{//需要创建一个临时的切片,使用copy复制结果//创建一个新的数组,并且与旧数组不共享相同的数据源p := make([]int, len(tmp))copy(p, tmp)res = append(res, tmp)return}if i > len(candidates) || sum > target{return }for j:=i;j<len(candidates);j++{if candidates[j]+sum > target{break}tmp = append(tmp, candidates[j])backtrack(j, sum+candidates[j])tmp = tmp[:len(tmp)-1]}}backtrack(0, 0)return res
}

另一种把切片作为方法参数的写法

var r [][]intfunc combinationSum(candidates []int, target int) [][]int {sort.Ints(candidates)backtrack(candidates, 0, target, 0, []int{})fmt.Println(r)return r
}func backtrack(candidates []int, i, target, sum int, path []int) {if sum > target {return}if sum == target {r = append(r, path)return}if i >= len(candidates) {return}for k := i; k < len(candidates); k++ {if sum+candidates[k] > target {break}tmp := make([]int, len(path))copy(tmp, path)tmp = append(tmp, candidates[k])backtrack(candidates, k, target,sum+candidates[k], tmp)tmp = tmp[:len(tmp)-1]}
}

也许以后可以用到的东西相关推荐

  1. tcp reno_如何使用称为Reno Expo的简单入门工具包构建全栈应用程序

    tcp reno Building any new project from scratch can be intimidating. There's a lot to decide before y ...

  2. 软件开发人员维护代码指南

    当你最初想要成为一个软件开发者的时候,你可能梦想着创造令人兴奋的新功能,玩弄一些新科技,并编写一些非常酷而有趣的代码. 但是你可能从未想过的是,要在一个拥有10年历史的并且由一个很多年前就离开公司的某 ...

  3. java编程石头剪刀布图片_石头、剪刀、布!10分钟带你打开深度学习大门,代码已开源...

    原标题:石头.剪刀.布!10分钟带你打开深度学习大门,代码已开源 沉沉 发自 宇宙中心 量子位 出品 | 公众号 QbitAI 深度学习技术的不断普及,越来越多的语言可以用来进行深度学习项目的开发,即 ...

  4. boost库 tbb_boost库常用库介绍

    在文本处理部分,conversion/lexcial_cast类用于"用C++"的方法实现数字类型和字符串之间的转换. 主要是替代C标准库中的 atoi. itoa之类的函数.当然 ...

  5. “一线城市,年薪30万+,我却裸辞回老家”一个前程序员的 10 年职业思考

    作者 | 柚子 来源 | LinkedIn(ID:LinkedIn-China) 2020年一场疫情让全世界陷入困境,大量企业倒闭,被迫裁员,很多人失业. "996"." ...

  6. blog摘录--测试感触

    我们做测试要踏踏实实,不要浮躁,浮躁只会让你继续sb,但是不会阻止别人nb. 现在不会做测试的拼命到处问怎么做测试,现在在手动测试的拼命问怎么做自动化,现在做自动化的拼命问怎么写测试框架,现在写测试框 ...

  7. 程序员从初级到中级10个秘诀 【转载】

    Justin James曾发表过一篇博文<10 tips for advancing from a beginner to an intermediate developer>,为我们分享 ...

  8. 傻子的成长日记,编程路上 2016-04-07

    1. 也许聪明的人很多,但是最后留下来的没有几个. 坚持很重要,就算自己学的很慢也不要放弃,不管代码能不能写出来,自己一定要去写,就算最后没有写出来,努力过就好. 2. 为什么随着时间的流逝,慢慢坚持 ...

  9. 码农的祖宗是个妹子?!信不信由你!

    2019独角兽企业重金招聘Python工程师标准>>> 19世纪,英国出现了一位著名的诗人-拜伦.创作了诸如<恰尔德·哈洛尔德游记>.<唐璜>等等一系列广为传 ...

最新文章

  1. Unity3d5.0之后关于游戏音乐的管理
  2. C语言中| 按位或, || 逻辑或。
  3. 做一个有梦想的咸鱼!
  4. linux 安装apache http server
  5. 6英寸全面屏·2000万四镜头 HUAWEI nova 2s正式发布
  6. Android 布局 优先显示右侧的控件
  7. 寒假作业3:抓老鼠啊~亏了还是赚了?
  8. 详解微信小程序开发(项目从零开始)
  9. 自然语言处理——文本的表示
  10. 线性代数及其应用(第三版)1.1节习题解答
  11. java环境配置(jdk、jre安装和环境配置)
  12. aforge java_C#使用Aforge调用摄像头拍照的方法
  13. 书蠹诗魔——张岱《湖心亭看雪》
  14. UG模具设计工程师需要哪些条件?潇洒UG模具设计
  15. 如何接受上级指令_职场老手教你怎么应对领导错误的指令,千万要注意这几点...
  16. js 判断 服务器连接状态,原生JS判断网站服务器是否开启问题及解决方案
  17. pytorch-psenet实现 并训练自己的数据集
  18. 职业规划-自动化测试
  19. 大数据智慧数字电商第五课 程序整合 可视化和BI分析
  20. 在国外期刊发表文章时一定用到的,SCI论文写法攻略

热门文章

  1. android 浏览器 cookie,从Android的浏览器中传递cookie数据到App中
  2. freenas mysql_FreeNAS简单配置使用
  3. 摆脱运营打杂,进阶高级运营!运营小咖秀特训营第3期圆满落幕
  4. OpenGL API - glViewport
  5. mysql视图怎么加字段_mysql视图添加字段
  6. FPGA—按键控制呼吸灯的时间
  7. 模糊的照片可以变清晰吗?
  8. hosts文件无法修改无法保存
  9. # hihocoder #1197 : Give My Text Back
  10. Please enter the correct username and password for a staff account. Note tha