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

go的匿名函数和闭包

go的匿名函数: func no_func() { // 匿名函数 1 f := func(i, j int) (result int) { // f 为函数地址 result = i + j return result } fmt.Fprintf(os.Stdout, "f = %v f(1,3) = %v\n", f, f(1, 3)) // 匿名函数 2 func(i, j int) (m, n int) { // x y 为函数返回值 return j, i }(1, 9) // 直接创建匿名函数并执行 } go的闭包: func adder() func(int) int { sum := 0 return func(x int) int { sum += x return sum...阅读全文

博文 2015-07-20 14:15 webyh

go 速学 - 14 - 反射

目录 反射 reflection 使用反射 前提 定义一个结构及方法 反射所有字段及方法 访问结构中的匿名字段 动态修改属性的值 动态调用方法 摘要 使用反射,匿名字段,动态修改属性,动态调用方法 反射 reflection 使用反射 前提 使用反射之前必须引用包 reflect 定义一个结构及方法 import "reflect" type User struct { Id int Name string Age int } func (u User) say() { fmt.Println("hello") } u := User{Id: 1, Name: "Peter", Age: 20} 反射所有字段及方法 reflect.TypeOf(o) 用于获得类型原型 reflect.Val...阅读全文

博文 2015-04-07 11:17 mrseasons

golang学习的点点滴滴:struct匿名字段

package main import "fmt" type Base struct { Name string Age int } type Child struct { Base // 匿名字段, 默认把Base的所有字段都继承过来了。 这样看起来才像真正的继承 Age int } func main() { c := new(Child) c.Name = "hello" // 可以直接使用Base中的字段 c.Age = 20 // 如果有重复的, 则最外的优先 fmt.Println(c.Name) // hello fmt.Println(c.Age) // 20 fmt.Println(c.Base.Age) // 要访问Base中的,可以这样写 0 ...阅读全文

博文 2014-09-29 22:10 亓斌哥哥

Golang 匿名字段

// code by shaoyongyang package main import ( "fmt" ) type People struct { name string age int weight int } type Student struct { People specialty string } func main() { liming := Student{People{"liming", 18, 183}, "None Specialty"} fmt.Println(liming.name) liming.People.name = "xiaohong" fmt.Println(liming.name) } 其实就是一个结构体,嵌入了另一个结构体。 对应的修改数据方式方式,...阅读全文

博文 2015-01-31 21:11 未来还没来

golang中channel的超时处理

并发中超时处理是必不可少的,golang没有提供直接的超时处理机制,但可以利用select机制来解决超时问题。 func timeoutFunc() { //首先,实现并执行一个匿名的超时等待函数 timeout := make(chan bool, 1) go func() { time.Sleep(1e9) //等待1秒钟 timeout <- true }() //然后,我们把timeout这个channel利用起来 select { case <- ch: //从ch中读到数据 case <- timeout: //一直没有从ch中读取到数据,但从timeout中读取到数据 } ...阅读全文

博文 2016-04-09 12:11 xjshi

Go 实现lamda、匿名函数和内联函数

Go 实现lamda、匿名函数和内联函数 在Go语言中,lamda、匿名函数和内联函数的实现称作字面函数(function literals)。当一个函数足够小时,你可以创建一个字面函数。下文将创建一个简单的实例来展示这个函数的实现。 package main import("fmt") func main(){ substract := func(a, b int) int { return a - b } fmt.Print("--substraction function literals: ", substract(10, 2), "\n") } 输出结果 --substraction function literals: 8 one-line函数有它具体的应用场合,特别是对于简单的...阅读全文

博文 2016-03-19 19:38 GreatElite

golang中所谓的”方法提升“,求解答。。。。

如果 S 包含一个匿名字段 T,S 的方法集不包含接受者为 *T 的方法提升。 这条原则说的是当我们嵌入一个类型,嵌入类型的接受者为指针的方法将不能被外部类型的值访问。 刚才在golang中国博客上看到这个说法,自己验证了后发现完全可以访问,哪位高手能解释下,期待ing........阅读全文

closures _ golang

Go supports anonymous functions, which can form closures. Anonymous functions are useful when you want to define a function inline without having to name it package main import ( "fmt" ) func intSeq() func() int { i := 0 return func() int { i += 1 return i } } func main() { nextInt := intSeq() fmt.Println(nextInt()) fmt.Println(nextInt()) fmt.Print...阅读全文

博文 2015-03-14 17:28 jackkiexu

Go语言以匿名组合的方式实现继承

type Base struct { FirstName, LastName string Age float32 } func (base *Base) HasFeet() { fmt.Println(base.FirstName + base.LastName + "has feet! Base") } func (base *Base) Flying() { fmt.Println("Base Can flying!") } type Sub struct { Base Area string } func (sub *Sub) Flying() { sub.Base.Flying() fmt.Println("Sub flying") } func main() { chk := n...阅读全文

博文 2016-03-15 10:18 cc7756789w

Go学习笔记:匿名成员

开始没搞明白啥是匿名成员,看了好几个文章,总算明白了,至少自认为是。 为啥需要匿名成员? 得从OO说起。OO要说是现代的计算机编程语言中必需的部分了。不过不同的语言对于如何实现OO中的各种概念做法并不一样。Go对OO提供了支持,但采用的是一种简洁并且直接的办法,没有类似于Java中的extends、implements关键字,而是直接用匿名成员,并通过“委派”来实现。比如下面这些代码: type E interface{ Start() Stop() Renewal(x int) } type W interface { Open() Close() Renewal() } type Car struct { E W } 有了这些,那么当创建了Car的实例以后,就可以使用: car.Star...阅读全文

golang 结构体笔记

一、概念 结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体。每个值称为结构体的成员。 二、结构体声明及使用 // 声明结构体 type Employee struct { ID int Name string } func main() { // 结构体实例化 emp := Employee{ID: 1, Name: "Frod"} // 匿名字段实例化 emp2 := Employee{1, "Frod2"} fmt.Println(emp) fmt.Println(emp2) } 三、聚合结构 golang没有继承的概念, 推崇的是类聚合 type Address struct { Province string City string Detail string } ...阅读全文

go语言struct

一、struct结构的定义: type person struct { name string age int } 这样就定义了一个person结构,name是字符串型的姓名;age是int型的年龄。 二、声明一个struct的变量: var p person 三、赋值: 方法有三种,分别如下: 1、直接赋值p.name = "xiaoming" p.age = 12 2、按照顺序初始化值 tom := person{"Tom", 20} 3、通过field:value的方式初始化,这样顺序可以随意 john := person{age:21, name:"John"} 四、struct的匿名字段 GO支持只提供字段类型,不提供字段名的声明方式。也就是匿名字段,也叫嵌入字段。(可以用java...阅读全文

博文 2016-01-29 14:40 fzk2008

golang语法总结(二十二):接口interface

类型关键字为interface 不需要显式声明实现某个接口,只要实现相关方法就实现了接口 基本示例: type Person interface { Name() string}type Student struct { name string}func (s Student)Name() string { return s.name}func main() { var p Person p = Student{name:"roc"} fmt.Println(p.Name()) //roc} 接口也可以组合(相当于继承) 可以试探是否为某个struct或interface的实例(ok pattern),相当于Java中的instanceof type Person interface { N...阅读全文

博文 2016-02-23 14:15 QQ245671051

Go学习笔记:panic()和recover()

如何理解: 1、调用panic函数相当于throw一个异常,逐层启动异常处理流程。在调用panic之前defer的操作会在调用panic后立即执行。 2、调用recover函数相当于catch了异常,会中止异常处理流程,并可以返回这个异常。 3、panic函数接受一个参数,任意类型,无返回值; 4、recover函数没有参数,返回值就是异常本身; 5、一般,recover函数放在defer后面的一个匿名函数中执行。个人认为还应该放在函数的首部; 一个例子 package main import ( "fmt" ) func work() { Log(10) panic("ERROR!") Log(100) } func Log(args ...interface{}) { fmt.Print...阅读全文

go-reflect

反射获取对象的属性,值,方法 package main import "fmt" import "reflect" func main() { u := User{1, "ok", 12} Info(u) } //任何一个对象都实现了空接口 func Info(o interface{}) { t := reflect.TypeOf(o) //获取类型 User类型 fmt.Println("Type", t.Name()) if K := t.Kind(); K != reflect.Struct { fmt.Println("传入的类型不对,不能传地址值,需要传对象或者基本数据类型的地址值") return } v := reflect.ValueOf(o) fmt.Println("f...阅读全文

博文 2016-08-14 22:53 u013210620

Struct含有匿名字段,该匿名字段有MarshalJSON方法,导致Struct不能正确转换成json字符串!!

这是问题的原地址: [http://stackoverflow.com/questions/38489776/idiomatic-way-to-embed-struct-with-custom-marshaljson-method](http://stackoverflow.com/questions/38489776/idiomatic-way-to-embed-struct-with-custom-marshaljson-method "http://stackoverflow.com/questions/38489776/idiomatic-way-to-embed-struct-with-custom-marshaljson-method") 目前我遇到,解决方法是有的,但找...阅读全文

go语言变参,匿名函数的多种用法

/** * Created by Administrator on 13-12-18. */ package main import ( "fmt" "os" ) func f1(args ...interface {}) { f2(args...) f2(args[1:]...) } func f2(args ...interface {}) { for i, v := range args { fmt.Fprintf(os.Stdout, "i = %d %v\n", i, v) } fmt.Fprintf(os.Stdout, "--------------\n") } func main() { f1(1, "hello", 3.14, main) // 匿名函数 1 f := fu...阅读全文

博文 2013-12-18 15:49 eclipser1987

Go语言中struct的匿名属性特征

Go语言中struct的属性可以没有名字而只有类型,使用时类型即为属性名。(因此,一个struct中同一个类型的匿名属性只能有一个) type PersonC struct { id int country string } //匿名属性 type Worker struct { //如果Worker有属性id,则worker.id表示Worker对象的id //如果Worker没有属性id,则worker.id表示Worker对象中的PersonC的id id int name string int *PersonC } func structTest0404() { w := &Worker{} w.id = 201 w.name = "Smith" w.int = 49 w.Perso...阅读全文

博文 2014-04-02 13:58 books1958

golang中的use-a和has-a

type Person struct { Name string Address Address } type Address struct { Number string Street string City string State string Zip string } func (p *Person) Talk() { fmt.Println("Hi, my name is", p.Name) } func (p *Address) Location() { //fmt.Println("I'm at", p.Address.Number, p.Address.Street, p.Address.City, p.Address.State, p.Address.Zip) fmt.Pr...阅读全文

博文 2015-01-23 14:35 menggucaoyuan

go-struct、方法

package main import "fmt" func main() { //创建对象,通过.方式进行初始化 a := person{} a.name = "wyf" a.age = 30 fmt.Println(a) //创建对象,通过类似构造的方式进行初始化 b := person{ name: "wyff", age: 300, } fmt.Println(b) //值传递 A(b) fmt.Println(b) //person引用传递 fmt.Println("-------引用地址传递--------") B(&b) fmt.Println(b) fmt.Println("-------初始化一个引用地址类型--------") r := &person{ name: "x...阅读全文

博文 2016-08-14 16:40 u013210620

Go语言编程(十三)之匿名组合

确切的说,Go语言也提供了继承,但是采用了组合的文法,所以我们将其称为匿名组合: type Base struct { Name string } func (base *Base) Foo() {...} func (base *Base) Bar() {...} type Foo struct { Base ... } func (foo *Foo) Bar() { foo.Base.Bar() ... } 以上代码定义了一个Base类(实现了Foo()和Bar()两个成员方法),然后定义了一个Foo类,该类从Base类“继承”并改写了Bar()方法(该方法实现时先调用了基类的Bar()方法)。 在“派生类”Foo没有改写“基类”Base的成员方法时,相应的方法就被“继承”,例如上面的例...阅读全文

博文 2016-08-09 14:45 JoeySheng

golang之interface(接口)与 reflect 机制

一、概述 什么是interface,简单的说,interface是一组method的组合,通过interface来定义对象的一组行为; interface类型定义了一组方法,如果某个对象实现了某个接口的所有方法,则此对象就实现了此接口; 1 package main 2 3 import "fmt" 4 5 type Human struct { 6 name string 7 age int 8 phone string 9 } 10 11 type Student struct { 12 Human //匿名函数 13 school string 14 loan float32 15 } 16 17 type Employee struct { 18 Human 19 company s...阅读全文

博文 2016-09-11 20:56 chris-cp

Go by Example: Closures

Go语言支持匿名函数。匿名函数可以组成函数闭包。当你想定义一个不需要命名的内联函数时,匿名函数是非常有用的。 package main import "fmt" // 这个"intSeq"函数返回另外一个在intSeq内部定义的匿名函数, // 这个返回的匿名函数包住了变量i,从而形成了一个闭包 func intSeq() func() int { i := 0 return func() int { i += 1 return i } } func main() { // 我们调用intSeq函数,并且把结果(函数)赋值给一个函数nextInt, // 这个nextInt函数拥有自己的i变量,这个变量每次调用都被更新。 // 这里i的初始值是由intSeq调用的时候决定的。 nextInt...阅读全文

博文 2015-01-02 19:39 codemanship

go语言接口使用

http://blog.csdn.net/love_se/article/details/7947440 下面为大家带来go语言三种接口使用模式,代码基于go1.0.2版本 第一种: [java] view plaincopyprint? package main import "fmt" type Writer interface { Write(data []byte) (int, error) } type writerImpl struct { } func (w *writerImpl) Write(data []byte) (int, error) { return len(data), nil } type Worker struct { Writer } func main(...阅读全文

博文 2013-09-02 14:40 ywh147

Go 实现lamda、匿名函数和内联函数

Go 实现lamda、匿名函数和内联函数 在Go语言中,lamda、匿名函数和内联函数的实现称作字面函数(function literals)。当一个函数足够小时,你可以创建一个字面函数。下文将创建一个简单的实例来展示这个函数的实现。 package main import("fmt") func main(){ substract := func(a, b int) int { return a - b } fmt.Print("--substraction function literals: ", substract(10, 2), "\n") } 输出结果 --substraction function literals: 8 one-line函数有它具体的应用场合,特别是对于简单的...阅读全文

博文 2016/07/29 17:53 abcijkxyz

go-struct、方法

package main import "fmt" func main() { //创建对象,通过.方式进行初始化 a := person{} a.name = "wyf" a.age = 30 fmt.Println(a) //创建对象,通过类似构造的方式进行初始化 b := person{ name: "wyff", age: 300, } fmt.Println(b) //值传递 A(b) fmt.Println(b) //person引用传递 fmt.Println("-------引用地址传递--------") B(&b) fmt.Println(b) fmt.Println("-------初始化一个引用地址类型--------") r := &person{ name: "x...阅读全文

博文 2016-08-14 16:40 u013210620

Go语言基础:struct

跟C语言或其它语言一样,也有结构体struct。C语言中用关键词typedef来给结构体定义,Go中用的都是type。 struct语法格式 type typeName struct { ... } 例如: type person struct { name string age int } struct声明 var P person P.name = "Sun" P.age = 30 //也可以 P := peron{"Sun", 30} //通过 field:value 的方式初始化,这样可以任意顺序 P := person{age:29, name:"Sun"} 上面有三种声明的方法,其中第三种比较特殊,是Go独有的声明。 struct的匿名字段 匿名字段也称为嵌入字段,C语言中也有这...阅读全文

博文 2016-09-01 14:32 uudou

Go 匿名函数的理解

通常不希望再次使用(即只使用一次的)的函数可以定义为匿名函数 详细链接 : https://www.kancloud.cn/xiaohuamao/riji/335713 package main import "fmt" func main() { //匿名函数 1 //f1 为函数地址 f1 := func(x, y int) (z int) { z = x + y return } fmt.Println(f1) fmt.Println(f1(5, 6)) //匿名函数 2 //直接创建匿名函数并运行 f2 := func(x, y int) (z int) { z = x + y return }(7, 8) fmt.Println(f2) //匿名函数 2 (无参数的形式) func...阅读全文

博文 2017-06-16 16:03:18 winnie121

Golang的嵌入和继承

golang不支持继承,只支持嵌入和聚合(匿名字段称为嵌入,具名字段称为聚合)。golang通过嵌入,可以到达类似继承的效果,而且更为简洁。 一个例子type Base struct{ b int } func (base *Base) setB(i int) { base.b = base.b + i } type Derive struct { Base // embed d int // aggregation } func (derive *Derive) setD(i int) { derive.d = derive.d + i } func main() { var d Derive fmt.Println(d.b, d.d) d.setB(5) d.setD(10) fmt.P...阅读全文

博文 2015-10-15 16:18:35 说话的白菜

go 方法的继承和重写

继承: package main import "fmt" type Human struct { name string age int phone string } type Student struct { Human //匿名字段 school string } type Employee struct { Human //匿名字段 company string } //在human上面定义了一个method func (h *Human) SayHi() { fmt.Printf("Hi, I am %s you can call me on %s\n", h.name, h.phone) } func main() { mark := Student{Human{"Mark", ...阅读全文

博文 2015年6月1日 谢权

【Go学习笔记】13、反射 reflect

反射reflection 反射可大大提高程序的灵活性,使得interface{}有更大的发挥余地反射使用TypeOf和ValueOf函数从接口中获取目标对象信息反射会将匿名字段作为独立字段(匿名字段本质)想要利用反射修改对象状态,前提是interface.data 是settable,即pointer-interface通过反射可以动态调用方法 结构体反射12345678910111213141516171819202122232425262728293031323334353637383940type User struct { Id int Name string Age int}func (u User) Hello() { fmt.Println("hello world")}fun...阅读全文

博文 May 16, 2017 HundredLee

【Go学习笔记】10、结构struct

结构struct Go中的struct与c中的struct非常相似,并且Go没有class 使用typestruct{} 定义结构,名称遵循可见性规则 支持指向自身的指针类型成员 支持匿名结构,可用作成员或定义成员变量 匿名结构也可以用于map的值 可以使用字面值对结构进行初始化 允许直接通过指针来读写结构成员 相同类型的成员可进行直接拷贝赋值 支持 == 与 != 比较运算符,但不支持 > 或 < 支持匿名字段,本质上是定义了以某个类型名为名称的字段 嵌入结构作为匿名字段看起来像继承,但不是继承 可以使用匿名字段指针 1234567891011121314151617181920212223242526272829type human struct{ Sex int}//使用组合//类似继...阅读全文