Go语言中文网 为您找到相关结果 72

Deno 并不是下一代 Node.js

这几天前端圈最火的事件莫过于 ry(Ryan Dahl) 的新项目 deno 了,很多 IT 新闻和媒体都用了标题:“下一代 Node.js”。这周末读了一遍 deno 的源码,特意写了这篇文章。长文预警(5000字,11图)。 0. 为什么开发 Deno? 这是我上周做的一张图,介绍了 JavaScript 的发展简史。刚才修改了一下,添加了对 Node.js 和 Deno 发布时间的标注。Node.js 和 Deno 分别是 Ryan Dahl 在 2009 年和 2018 年,基于当年最新的前端技术开发的非浏览器 JavaScript 运行时。 Ryan Dahl 开发 deno 并不是因为 “just for fun”,也不是为了取代 node。下面慢慢解释。 1. 目前 deno ...阅读全文

博文 2018-06-04 11:34:38 justjavac

腾讯云360元 6年时长最新完整方案

腾讯云新用户认证学生身份可享受1核CPU、2G内存、1M带宽的云服务器10元/月的价格。 同时买1年(120元)送4个月,特价续费两年(120元*2),共支出360元。 得到3年的特价学生云服务器,然后在控制面板降配,会获得5年左右的时长。 具体步骤: 1、准备一个未购买过腾讯云的新账号,新注册QQ也可。 2、进入参团链接:https://cloud.tencent.com/act/campus/group/detail?group=20561 3、登陆腾讯云账号,进行实名认证(这个带参团性质,貌似需要参团才可以参与) 4、进行学生认证,(随便填就可以):https://cloud.tencent.com/act/campus/student_ver...阅读全文

腾讯云360元 6年时长完整方案

腾讯云新用户认证学生身份可享受1核CPU、2G内存、1M带宽的云服务器10元/月的价格。 同时买1年(120元)送4个月,特价续费两年(120元*2),共支出360元。 得到3年的特价学生云服务器,然后在控制面板降配,会获得5年左右的时长。 具体步骤: 1、准备一个未购买过腾讯云的新账号,新注册QQ也可。 2、进入参团链接:https://cloud.tencent.com/act/campus/group/detail?group=16924 3、登陆腾讯云账号,进行实名认证(这个带参团性质,貌似需要参团才可以参与) 4、进行学生认证,(随便填就可以):https://cloud.tencent.com/act/campus/student_ver...阅读全文

腾讯云360元 6年时长最新完整方案, 亲测

腾讯云新用户认证学生身份可享受1核CPU、2G内存、1M带宽的云服务器10元/月的价格。 同时买1年(120元)送4个月,特价续费两年(120元*2),共支出360元。 得到3年的特价学生云服务器,然后在控制面板降配,会获得5年左右的时长。 具体步骤: 1、准备一个未购买过腾讯云的新账号,新注册QQ也可。 2、进入参团链接:https://cloud.tencent.com/act/campus/group/detail?group=21901 3、登陆腾讯云账号,进行实名认证(这个带参团性质,貌似需要参团才可以参与) 4、进行学生认证,(随便填就可以):https://cloud.tencent.com/act/campus/student_ver...阅读全文

腾讯云+校园服务器,360元3年4个月

1.注册新用户,老用户可以直接注册个新号,使用绑定银行卡的手机认证即可。 2.点击**参团链接**:有效期到3月9号10点:https://cloud.tencent.com/act/campus/group/detail?group=15533 3.购买1年,付120元,可送4个月 4.可续费两年,付款240 5.最后可以花**360元**购买到**3年4个月**的服务器时长。 6.**配置**是**1核2G内存** ...阅读全文

Go 系列教程 —— 29. Defer

欢迎来到 [Golang 系列教程](https://studygolang.com/subject/2)的第 29 篇。 ## 什么是 defer? `defer` 语句的用途是:含有 `defer` 语句的函数,会在该函数将要返回之前,调用另一个函数。这个定义可能看起来很复杂,我们通过一个示例就很容易明白了。 ## 示例 ```go package main import ( "fmt" ) func finished() { fmt.Println("Finished finding largest") } func largest(nums []int) { defer finished() fmt.Println("Started finding largest") max := ...阅读全文

博文 2018-03-30 23:05:21 heyulong

golang中的格式化输入输出

【简介】 fmt 包实现了格式化 I/O 函数,类似于 C 的 printf 和 scanf。格式“占位符”衍生自 C,但比 C 更简单。 【打印】 占位符: [一般] %v 相应值的默认格式。在打印结构体时,“加号”标记(%+v)会添加字段名 %#v 相应值的 Go 语法表示 %T 相应值的类型的 Go 语法表示 %% 字面上的百分号,并非值的占位符 [布尔] %t 单词 true 或 false。 [整数] %b 二进制表示 %c 相应 Unicode 码点所表示的字符 %d 十进制表示 %o 八进制表示 %q 单引号围绕的字符字面值,由 Go 语法安全地转义 %x 十六进制表示,字母形式为小写 a-f %X 十六进制表示,字母形式为大写 A-F %U Unicode 格式:U+1234...阅读全文

博文 2016-06-01 11:00:01 xiaoyida11

golang 函数一 (定义、参数、返回值)

对于GoLang函数的定义或者说理解:函数是结构化编程中最小的模块单元,日常开发过程中,将复杂的算法过程分解为若干个小任务(代码块),使程序的结构性更清晰,程序可读性提升,易于后期维护和让别人读懂你的代码。另外为了更好的重用你的代码,可以把重复性的任务抽象成一个函数。Go语言中使用关键词func来定义一个函数,并且左花括号不能另起一行,比如:func hello(){ //左花括号不能另起一行 println("hello") }Go语言中定义和应用函数时,有如下需要注意的点: 函数无须前置声明 不支持命名嵌套定义,支持匿名嵌套 函数只能判断是否为nil,不支持其它比较操作 支持多返回值 支持命名返回值 支持返回局部变量指针 支持匿名函数和闭包func hello() { //左括号不能另起...阅读全文

博文 2017-02-10 11:05:00 100018

Go语言中的多维数组传递

在Go语言中,当多维数组直接作为函数实参进行参数传递的时候,会有很大的限制性,比如除第一维数组的其他维数需要显式给出等;此时可以使用多维切片来作为参数传递: type s1 []int type s2 []s1 剑指offer一书面试题3: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列按照从上到下的顺序排序。完成一个函数,输入二维数组和要查找的数,判断该数是否存在于二维数组中。 代码: package main import ( "errors" "fmt" "os" ) type s1 []int type s2 []s1 var searchErr error = errors.New("search error") func main() { a := s2{ s1{1...阅读全文

博文 2016-05-13 08:00:02 air_upc

ECUG

由 ECUG 社区主办的一年一度技术盛会,参会的社区成员涵盖 Google、微软、 BAT、华为、京东、携程等知名企业技术高层以及七牛云、饿了么、PingCAP、Kylingence 等创业公司创始人。自 2007 年开始举办以来,已经有逾 4000 名技术从业者参加过 ECUG Con 。联 系 人:高女士联系电话:+ 86 150 2668 1370邮 箱:marketing@qiniu.com时 间:2020 年 1 月 4 ~ 5 日会议地址:杭州市上城区 白云路 9 号 - 江南1535扫码购...阅读全文

博文 2019-12-21 15:34:29 实效云计算用户组

go语言:函数参数传递详解

参数传递是指在程序的传递过程中,实际参数就会将参数值传递给相应的形式参数,然后在函数中实现对数据处理和返回的过程。比较常见的参数传递有:值传递,按地址传递参数或者按数组传递参数。 1、常规传递 使用普通变量作为函数参数的时候,在传递参数时只是对变量值得拷贝,即将实参的值复制给变参,当函数对变参进行处理时,并不会影响原来实参的值。 例如: package main import ( "fmt" ) func swap(a int, b int) { var temp int temp = a a = b b = temp } func main() { x := 5 y := 10 swap(x, y) fmt.Print(x, y) } 输出结果:5 10 传递给swap的是x,y的值得拷贝...阅读全文

博文 2016-07-03 02:00:01 chase-wind

第二届Gopher大会即将在北京举行,就等你来

去年我们在上海举行了第一届Gopher大会,那一次大会参会人员在500人左右,会后大家都觉得这是参加过的最实在,最物超所值,干货最多的大会。这里有去年参会的人员写的一些回顾,大家可以体会当时的情形 - http://thinkandcode.info/gopherchina2015can-hui-ji-lu/ - http://fuxiaohei.me/2015/4/29/gopher-china-2015.html - http://life.leanote.com/post/gopher-china-2015-my-golang-way 说了那么多,回到我们今年这一届的大会,因为北京可以说是中国的互联网中心,这里有着大量的Go使用者,而且我去年也答应了很多北京的同学,...阅读全文

go interface的一点心得

先看golanger.com关于interface的说明 *Interfaces in Go provide a way to specify the behavior of an object: if something can do this, then it can be used here* 翻译下来就是: interfaces 用来指定一个object的的行为,如果该object能够执行该行为,这个接口就可以替代这个对象。 文档中举了一个例子: fmt包中的Fprintf方法 `func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error)...阅读全文

Go语言学习——深入了解defer

1.简介 defer是Go语言中的延迟调用函数,它是在函数真正返回之前立即执行,一般用于资源回收、捕捉异常操作,其实现原理是: 1)在对应语句打上标签,告诉系统,先不要调用、先执行入栈操作,待函数退栈时在一并调用; 2)当defer语句入栈时,会将函数地址、函数实参一同入栈,如果实参是表达式、函数语句,则会优先运行; 3)函数退栈时,无论是正常调用结束还是触发panic,都会调用之前入栈的defer语句,若有多个defer语句时,则按照FILO顺序执行调用; 2.使用 下面介绍def...阅读全文

golang fmt.printf I/O 函数格式化说明

[TOC] 说明 fmt 包实现了格式化 I/O 函数,类似于 C 的 printf 和 scanf格式“占位符”衍生自 C,但比 C 更简单 常用格式化输出 fmt.Printf("start at number %v, end count %v\n",start, count) 注意参数输出数量和占位符数量要一致 IDEA开发快速格式化模板 使用IDEA开发可以配置自定义代码模板快速生成 Settings -> Editor -> Live Templates 选中 go 语言展开 选则增加一条 Abbreviation 填写 fpf Description 填写 print fmt format Template text fmt.Printf("$END$",$VAR$) Appli...阅读全文

博文 2017-03-05 19:34:39 泛原罪

golang学习的点点滴滴:指针,地址,形参,实参

学习Go语言的过程中,会发现它的指针,地址,还有函数参数跟平常我们理解的不太一样. 上代码: package main //学习指针用法 import ( "fmt" ) func main() { var i int; // i 的类型是int型 var p *int; // p 的类型是[int型的指针] i = 1; // i 的值为 1; p = &i; // p 的值为 [i的地址] fmt.Printf("i=%d;p=%d;*p=%d\n",i,p,*p); *p = 2; // *p 的值为 [[i的地址]的指针](其实就是i嘛),这行代码也就等价于 i = 2 fmt.Printf("i=%d;p=%d;*p=%d\n",i,p,*p); i = 3; // 验证我的想法 ...阅读全文

博文 2014-10-04 19:27:24 亓斌哥哥

golang 实现try catch

package main import "fmt" func main(){ Try(func() { panic("foo") }, func(e interface{}) { fmt.Println(e) }) defer func(){ // 必须要先声明defer,否则不能捕获到panic异常 fmt.Println("c") if err:=recover();err!=nil{ fmt.Println(err) // 这里的err其实就是panic传入的内容,55 } fmt.Println("d") }() f() } func f(){ fmt.Println("a") panic(55) fmt.Println("b") fmt.Println("f") } func Tr...阅读全文

博文 2019-11-25 12:32:39

golang 格式化输入输出

fmt 包实现了格式化 I/O 函数,类似于 C 的 printf 和 scanf。格式“占位符”衍生自 C,但比 C 更简单。 【打印】 占位符: [一般] %v 相应值的默认格式。在打印结构体时,“加号”标记(%+v)会添加字段名 %#v 相应值的 Go 语法表示 %T 相应值的类型的 Go 语法表示 %% 字面上的百分号,并非值的占位符 [布尔] %t 单词 true 或 false。 [整数] %b 二进制表示 %c 相应 Unicode 码点所表示的字符 %d 十进制表示 %o 八进制表示 %q 单引号围绕的字符字面值,由 Go 语法安全地转义 %x 十六进制表示,字母形式为小写 a-f %X 十六进制表示,字母形式为大写 A-F %U Unicode 格式:U+1234,等同于 ...阅读全文

博文 2015-12-22 12:00:05 zhangxing__

golang中的接口实现

golang中的接口实现 // 定义一个接口 type People interface { getAge() int // 定义抽象方法1 getName() string // 定义抽象方法2 } type Man struct { } func (a *Man) getAge() int { // 实现抽象方法1 return 18 } func (a *Main) getName() string { // 实现抽象方法2 return "Sheldon" } func TestPeople(p interface{}) { switch p.(type) { // 变量.(type) 只能在 switch 中使用 case People: fmt.Println("实现了 Peop...阅读全文

博文 2020-02-13 09:32:46 哆啦在这A梦在哪

golang深入源代码系列之三:自动生成代码

这是系列博文的第三篇,第一篇在此:[golang深入源代码之一:AST的遍历](http://baixiaoustc.com/2019/01/14/2019-01-14-golang-code-inspector-1-all-case),第二篇在此:[golang深入源代码系列之二:反向调用关系的生成](http://baixiaoustc.com/2019/01/17/2019-01-17-golang-code-inspector-2-reverse-call-graph/)。 # 问题描述 第一篇讲了怎么遍历一个项目的源代码,第二篇讲了怎么构建内部某个package的某个函数`package.XYZ()`的反向调用关系(一颗多叉树)。那么问题来了,如果我们想在`package.XYZ(...阅读全文

博文 2019-04-18 09:26:06 baixiaoustc

Go语言的指针 & *

Go语言保留着C中值和指针的区别,但是对于指针繁琐用法进行了大量的简化,引入引用的概念。所以在Go语言中,你几乎不用担心会因为直接操作内寸而引起各式各样的错误。Go语言的指针,基本上只剩下用于区分 byref 和 byval 语义。 运算符就是简单的 & 和 * 一个取地址、一个解析地址。 package main import( "fmt" ) func main(){ var i int // i 的类型是int型 i=1 // i 的值为 1; var p *int // p 的类型是[int型的指针] p=&i // p 的值为 [i的地址] fmt.Printf("i=%d;p=%d;*p=%d\n",i,p,*p) *p=2 // *p 的值为 [[i的地址]的指针] (其实就是...阅读全文

博文 2014-10-29 14:40:07 ghj1976

go语言的参数传递

对于一门语言,在函数传参时,存在两种方式,一种是值传递,一种是引用传递,那么go语言是怎么进行参数传递的值传递是传递的变量的副本,引用传递指的是传递该变量的地址,在值传递过程中,函数对函数形参数的修改,不会导致实参的修改,而引用传参,对形参的修改,会导致该实参的修改,这是过去我们在其它语言中的一些认知,那么go语言会颠覆我们过去的认知,使用了一种新的方式. demo1 package main import ( "fmt" ) func main() { a := 10 fmt.Println("实参的地址",&a) update(a) fmt.Println(a) } func update(b int) { b = 1 fmt.Println("形参的地址",&b) } // 运行结果 ...阅读全文

博文 2018-08-12 00:34:58 暮雨

go语言中数组

数组是go语言内置的一种数据类型,对于该类型,将通过几下几点进行展开 数组声明和初始化 数组有以下几种声明初始化的方式 // 方法1 var arr [5]int // 方法2 var arr = [5]int{1,2,3,4,5} // 方法3 arr := [5]int{1,2,3,4,5} // 方法4 arr := [...]int{1,2,3,4,5} // 特定赋值 arr := [5]int{1:2,4:3} 数组使用 数组赋值 var arr = [5]int{} arr[1]=3 数组取值 var arr = [5]int{5,4,3,2,1} num := arr[1] 数组遍历 // for 遍历 var arr = [5]int{1,2,3,4,5} for i :=...阅读全文

博文 2018-08-12 16:34:59 暮雨

Go语言之可变参数函数

文转自公众号:灰子学技术原文链接:https://mp.weixin.qq.com/s/1ZLeWvORqR-MKBgn5hAvnAGo中的函数支持可变参数,这一特性其实只是Go语言的一种语法糖,格式如下所:func function(values...Type) {} // Type:表示的是具体的参数归属类型,可以是int,string...甚至interface例子1: 可变参数是同一种类型的​通过上面的代码可以看出,可变参数的函数,对4种参数的输入方式都支持,它们分别是:1.不输入参数;2.输入一个参数;3.输入多个参数;4.按照slice的方式输入。输出的结果则都可以正常计算这些不同输入的计算结果。备注:相同类型的可变参数方式,其实输入的参数类似与[]type的这种slice作为入...阅读全文

博文 2019-11-12 17:27:40 ZhDavis

go 协程与主线程强占运行

最近在学习了go 语言 , 正好学习到了 协程这一块 ,遇到了困惑的地方.这个是go语言官方文档 . 在我的理解当中是,协程只能在主线程释放时间片后才会经过系统调度来运行协程,其实正确的也确实是这样的,但是我遇到了协程强占主线程的一个问题,经过帮助,现在已经了解.废话不多说,先看代码 1 package main 2 3 import ( 4 "fmt" 5 "time" 6 ) 7 8 func main() { 9 go say("world") 10 say("hello") 11 /* 12 fmt.Println("---------------1") 13 14 a := []int{7, 2, 8, -9, 4, 0} 15 fmt.Println("===", a[:len(...阅读全文

博文 2017-02-17 15:00:14 qo2yycc2

致入门的程序员们: 你需要的可能只是个能简单分享、讨论的地方

在这个几乎满是"入门程序员"的时代,却几乎很难见到有恒心的人去认真的为自己做的每一步做下记录。 学习编程的路,可能并不像大佬们说的,只是「万事开头难」。事实是,你会遇到比你想象中多得多的障碍。但同时,也是你能获得经验的每一步。 我是一名因为某些原因而没能进入本科学习课堂的大专生。大专的课堂,几乎是没有什么能学习到「真材实料」的知识的机会的。计算机学了三年,却仍在拆机箱、拔内存、装系统。 如果你也是同样拥有爱好,想让自己拥有一技之长的人;或像我一样学历低,但不想一生碌碌而为的人;或像...... 无论如何,也无论你学习的是Python、Java或是Golang等等语言,在踩坑的同时,更重要的是「记录过程」。当你因为解决了一个小BUG而感到欣喜时,首要的第一件事应该是将其记录下来。相信我,你一定...阅读全文

博文 2019-02-19 12:34:42 AdlerChen

golang给请求参数追加参数

在做web服务的时候,偶尔会碰到这种需求,给http请求追加参数,下面是一些关于此类需求的记录。 if c.Request.Method == "GET" { query := c.Request.URL.Query() query.Set("login_uid", gdsLoggedUid) c.Request.URL, _ = c.Request.URL.Parse(query.Encode()) fmt.Printf("%c[1;43;30m--LOCAL--GET-- %v%c[1;43;30m\n", 0x1B, c.Request.URL, 0x1B) } if c.Request.Method == "POST" { bodyData, _ := c.GetRawData() ...阅读全文

博文 2019-11-26 18:32:42

Golang中defer、闭包以及命名返回值

defer 后面跟普通函数 package main func main() { run() } func run() { name := "Paul" defer sayHello(name) name = "John" } func sayHello(name string) { println("Hello " + name) } // Hello Paul 只是延缓执行,实参会按照正常顺序传入函数中 defer、return 和未命名的返回值 package main func main() { name := run() println("return: name = " + name) } func run() (string) { name := "Paul" defer sa...阅读全文

博文 2018-07-21 22:34:46 永遠的草莓地

一文理清 Go 引用的常见疑惑

今天,尝试谈下 Go 中的引用。 之所以要谈它,一方面是之前的我也有些概念混乱,想梳理下,另一方面是因为很多人对引用都有疑问。我经常会看到与引用有关的问题。 比如,什么是引用?引用和指针有什么区别?Go 中有引用类型吗?什么是值传递?址传递?引用传递? 在开始谈论之前,我已经感觉到这必定是一个非常头疼的话题。这或许就是学了那么多语言,但没有深入总结,从而导致的思维混乱。 前言 我的理解是,要彻底搞懂引用,得从类型和传递两个角度分别进行思考。 从类型角度,类型可分为值类型和引用类型,一般而言,我们说到引用,强调的都是类型。 从传递角度,有值传递、址传递和引用传递,传递是在函数调用时才会提到的概念,用于表明实参与形参的关系。 引用类型和引用传递的关系,我尝试用一句话概括,引用类型不一定是引用传递...阅读全文

博文 2019-09-29 00:04:22 波罗学

go语言实现令牌桶算法

package main import ( "fmt" "time" ) var ( lastRequestTime int64 = time.Now().Unix() tokenSurplus int64 = 0 qps int64 = 5 ) func getMin(a, b int64) int64 { if a > b { return b } return a } func getToken() bool { now := time.Now().Unix() temp := (now-lastRequestTime)*qps + tokenSurplus tokenNow := getMin(temp, qps) if tokenNow > 0 { lastRequestTime ...阅读全文

博文 2020-04-10 13:32:41 xxfaxy

golang中nil有趣转化

nil 函数自动转化 函数形参:nil; 测试函数 func nilTest(in []int) []int { // 验证 转化 fmt.Println(in) m := make([]int, 10) ret := append(in, m...) return ret } 猜想测试 func main() { fmt.Println(nilTest(nil)) } // 输出信息: [] [0 0 0 0 0 0 0 0 0 0] 得出结论 当调用函数时候,实参是nil,会自动转化成形式参数类型,目前测试,只能转化切边类型...阅读全文

博文 2018-07-04 18:34:42 Tim_SSS

[杭州][数澜科技][梦想小镇] 招聘 Node.js 工程师,急得就像大四了还没找到女朋友

公司官网:https://www.dtwave.com 招聘职位: 资深 /高级 /初级 Node.js 开发工程师 职位要求: 1、熟练掌握 JavaScript 语言特性,深刻理解 Node.js 后端技术栈的用武之地。 2、一年以上 Node.js 相关开发经验,熟悉 Koa、Express 等 web 框架。 3、基于 Node.js 开发过的产品至少使用到 MySQL、Redis、MongoDB、ZooKeeper 中的一项或多项。 4、对代码质量,技术文档有强迫症般的自我要求。 4、良好的沟通能力和团队协作能力,乐于探索和分享新技术。 加分项: 1、长期有任何形式的技术经验输出习惯,如:博客,开源项目,技术分享大会等。 2、熟悉其他优秀的编程语言,如 Python、Golang ...阅读全文

博文 2017-08-24 15:34:50 干了这瓶妇炎洁

golang类和结构体

golang结构体和类 golang中并没有明确的面向对象的说法,实在要扯上的话,可以将struct比作其它语言中的class。 类声明 type Poem struct { Title string Author string intro string } 这样就声明了一个类,其中没有public、protected、private的的声明。golang用另外一种做法来实现属性的访问权限:属性的开头字母是大写的则在其它包中可以被访问,否则只能在本包中访问。类的声明和方法亦是如此。注意: p1 := &Poem{ "zhangsan", 25, []string{"lisi", "wangwu"}, } 使用中如果包含数组,结构体的实例化需要加上类型如上如果intro的类型是[]string...阅读全文

博文 2017-12-07 07:04:42 卢春风

C语言、python、go、C#版本选择排序

C语言版本 #include void swap(int *a,int *b) { *a=*a+*b; *b=*a-*b; *a=*a-*b; } int getminkey(int *arr,int start,int len) { int k = start,i, minkey=arr[start]; for(i = start + 1; i < len ;i++) { if(arr[i] < minkey) { minkey=arr[i]; k=i; } } return k; } void select_sort(int *arr,int len) { int i; for(i = 0;i < len ; i++) { int k = getminkey(arr,...阅读全文

博文 2015-06-17 23:00:40 zhouqinghe24

golang中方法的receiver为指针和不为指针的区别

前言 最近看网站有同学提问golang中方法的receiver为指针和不为指针有什么区别,在这里我以简单易懂的方法进行说明,帮助刚刚学习golang的同学. 方法是什么 其实只要明白这个原理,基本就能理解上面提到的问题. 方法其实就是一种特殊的函数,receiver就是隐式传入的第一实参. 举个例子 type test struct{ name string } func (t test) TestValue() { } func (t *test) TestPointer() { } func main(){ t := test{} m := test.TestValue m(t) m1 := (*test).TestPointer m1(&t) } 是不是很简单就明白了呢?现在我们来加入...阅读全文

博文 2017-06-22 15:06:08 pinecone

棒棒哒的Go Interface

棒棒哒的Go Interface 原文:Interface: the awesomesause of Go 译文出处:酱油蔡的酱油坛 让我们稍微重温下。我们知道基本的数据类型,使用它们,并且学会创建复合数据类型。我们还知道一些基本的流程控制结构。所以我们能基于这些编程实现功能。 接下来我们发现函数实际上也是一种数据,它们是它们自己的值并且也有类型。我们继续学习方法。我们使用方法写函数来操作数据,然后继续实现功能性的数据类型。 这一章我们将进入Go的下一个境界。我们将学习对象的一些天生的洪荒之力来做一些实际事情。 废话少说,直奔主题! Interface是什么? 简而言之,Interface就是一组方法的集合。我们使用Interface指定一个给定对象的行为。例如前面章节提到的,Student...阅读全文

博文 2016-09-15 18:00:02 xingwangc2014

golang深入源代码系列之三:自动生成代码

这是系列博文的第三篇,第一篇在此:golang深入源代码之一:AST的遍历,第二篇在此:golang深入源代码系列之二:反向调用关系的生成。 问题描述 第一篇讲了怎么遍历一个项目的源代码,第二篇讲了怎么构建内部某个package的某个函数package.XYZ()的反向调用关系(一颗多叉树)。那么问题来了,如果我们想在package.XYZ()里面增加一些信息,该信息只能从最外层依次传递进来,中间可能经历若干个函数。手动写这个代码很烦躁,中间的函数都可能需要增加parameter,并传递给下一级。反向查找调用关系更是繁琐。本篇就来讲怎么自动生成这个代码。 一个例子 依然使用第二篇文章的例子,如下为测试项目的文件结构: -- /exmaple/test3.go -- /exmaple/test...阅读全文

博文 2019-04-18 09:34:40 白想要起飞

leetcode_28

Golang: 思路:其实就是KMP吧 func getNext(s string) []int { next:=make([]int,len(s)) next[0]=-1 i,j:=0,-1 for ; i< len(s)-1; { if j==-1||s[i]==s[j] { i++ j++ next[i]=j }else { j=next[j] } } return next } func strStr(haystack string, needle string) int { if len(needle)==0{ return 0 } i,j:=0,0 next := getNext(needle) for ; i< len(haystack); { if j==len(needle...阅读全文

博文 2020-01-25 23:32:46 淳属虚构

Go 中的可变参函数

当函数最后一个参数为 *...T* 时(*T* 前面的三个点是特意的),就叫*可变参函数*: ```go package main import "fmt" func sum(numbers ...float64) (res float64) { for _, number := range numbers { res += number } return } func main() { fmt.Println(sum(1.1, 2.2, 3.3)) } ``` 可变参函数允许传递任意数量(可变)的实参,在函数内部通过一个 [slice](https://golang.org/ref/spec#Slice_types) 来访问这些参数的值(例如上面代码中的参数成员)。 > 只有在最后一个形参...阅读全文

博文 2018-07-30 21:32:54 polaris

go 的变参函数

package main import "fmt" // Here's a function that will take an arbitrary number // of `ints` as arguments. func sum(nums ...int) { fmt.Print(nums, " ") total := 0 for _, num := range nums { total += num } fmt.Println(total) } func main() { // Variadic functions can be called in the usual way // with individual arguments. sum(1, 2) sum(1, 2, 3) //...阅读全文

博文 2017-02-10 12:22:11 谢权

golang中builtin包

1、介绍builtin包 中文官方标准库给出的介绍:builtin包为Go预声明标识符提供了文档。 2、builtin内容 const ( true = 0 == 0 // 无类型布尔值 false = 0 != 0 // 无类型布尔值 ) true和false是两个无类型布尔值 const iota = 0 // 无类型整数值 iota是一个预定义的标识符,代表顺序按行增加的无符号整数。每个const声明单元(被括号括起来)相互独立,分别从0开始。 type bool bool 布尔类型 type byte byte 8位无符号整型。是uint8的别名,二者视为同一类型 type rune rune 32位有符号整型,int32的别名,二者视为同一类型。 type int int 至少32...阅读全文

博文 2018-12-02 17:34:40 laijh

方法,接口学习笔记

之前在开发中编得过就行,没有好好地去思考一些细节问题,比如interface到底有什么用,现在好好总结下1.方法 package main import "fmt" import "reflect" type S struct { a int } func (s S) Set1(v int) { s.a = v } func (s *S) Set2(v int) { s.a = v } func (s *S) Get() int { return s.a } func main() { var s1 S var s2 *S s1.Set1(100)//receiver类型为T的实例,Set1修改的只是s1的副本 fmt.Println(s1.Get()) s1.Set2(100)//rece...阅读全文

golang不定长传参

golang不定长传参,三个点... 可以很灵活的传入多个参数,给两个例子,一看就明白了 1、int类型不定长传参 package main import "fmt" func main() { fmt.Println(Sum(1, 4, 6, 7, 8, 9, 100, 200)) } func Sum(numbers ...int) int { result := 0 for _, n := range numbers { result += n } return result } go run test1.go 335 2、map类型不定长传参 package main import "fmt" func main() { fmt.Println(SumMap(map[string]s...阅读全文

博文 2019-12-06 21:33:45 1350368559

Go语言学习笔记(七)之方法

在面对对象编程(OOP),我们常把某个对象实现的具体行为的函数称作方法。例如 C++中A类的某个函数实现了某种行为,我们就叫做 A 的方法。在 golang 中如果要定义一个方法,只需要在函数声明时,在函数名前加上某个变量,即该变量实现了某个方法。 ##### 方法声明 ```go type Point struct{ X, Y float64 } //按照传统方法,我们可能会按照下面的方式来写 func Distance(p, q Point) float64 { return math.Hypot(q.X - p.X, q.Y - p.Y) } //但在 go 语言中则是这样 func (p Point) Distance(q Point) float64 { return math.H...阅读全文

博文 2019-04-13 16:19:16 goelo

golang的"..."备忘

1. 用于数组: 表示长度与元素个数相同. 在golang中数组的长度是类型的一部分,不同长度,不同类型. 2. 用于参数: 用于形参表示可变参数. 用于实参表示直接传递. 具体解释参数见官方文档: 传递可变参数时: (1) 如果实参后不跟..., 则在底层创建与形参类型相同的slice,然后将实参赋值后传递. (2) 如果实参后跟..., 则不在底层创建与形参类型相同的slice,而是直接将实参传递给形参. /ref/spec#Passing_arguments_to_..._parameters Passing arguments to ... parameters If f is variadic with a final parameter p of type ...T, then ...阅读全文

博文 2016-09-09 18:00:01 zolo