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

golang学习之指针、内存分配

1 func pointer_test() { 2 //空指针,输出为nil 3 var p *int 4 fmt.Printf("p: %v\n", p) 5 //指向局部变量,变量值初始为0 6 var i int 7 p = &i 8 fmt.Printf("p: %v,%v\n", p, *p) 9 //通过指针修改变量数值 10 *p = 8 11 fmt.Printf("p: %v,%v\n", p, *p) 12 //数组的初始化及输出 13 m := [3]int{3, 4, 5} 14 fmt.Printf("m:%v--%v,%v,%v\n", m, m[0], m[1], m[2]) 15 //指针数组的初始化及输出 16 //j, k, l := 3, 4, 5 17...阅读全文

博文 2015-03-23 14:00:00 neujie

Go语言之nil详解

Go语言中的nil远比java中的null要难以理解和掌握。 1.普通的 struct(非指针类型)的对象不能赋值为 nil,也不能和 nil 进行判等(==),即如下代码,不能判断 *s == nil(编译错误),也不能写:var s Student = nil。 s := new(Student) //使用new创建一个 *Student 类型对象 fmt.Println("s == nil", s == nil) //false //fmt.Println(*s == nil) //编译错误:cannot convert nil to type Student fmt.Printf("%T\n", s) //*test.Student fmt.Printf("%T\n", *s) //...阅读全文

博文 2015-06-17 23:00:49 books1958

Golang中new和make的区别

new会分配结构空间,并初始化为清空为零,不进一步初始化 new之后需要一个指针来指向这个结构 make会分配结构空间及其附属空间,并完成其间的指针初始化 make返回这个结构空间,不另外分配一个指针 例子new: var p *[]int = new([]int) 或 p := new([]int) 以上分配了一个slice结构,但是结构中的应该指向底层数组的ptr指针为空,故实际不能往这个slice里面存取数据 同时分配了一个指针p,也即(在32位系统中)占4个字节并存放slice结构的地址 例子make: var v []int = make([]int, 0) v := make([]int, 0) 以上分配了一个slice结构,且结构中的应该指向底层数组的ptr指针已经指向了某个底...阅读全文

博文 2015-10-16 12:00:01 ahlxt123

golang解决import cycle not allowed的一种思路

项目中碰到了一些问题,使用了指针函数的思路来解决相应问题 在实际项目中,因为两个项目互相引了对方的一些方法,导致了循环引用的错误,原本可以使用http的请求来解决,经过其他人指导,发现了可以使用指针函数来解决 这里通过一个简单的例子来说明,首先是例子的结构,我们仅仅用到了这两个文件:ciconnector.go和rockettest.go 例子结构 原本设定的方法是这两个包里的函数互相调用,那么我们通过代码来看下怎么解决相应的问题。 首先是rockettest.go,这里调用了ciconnector.go中的Test方法,代码如下 package main import ( "fmt" "citest" ) func main() { str := "hello world" citest....阅读全文

博文 2017-08-08 15:05:12 南尼喜嘛斯嘎

golang技术随笔(一)深入理解interface

Go语言的主要设计者之一罗布·派克( Rob Pike)曾经说过,如果只能选择一个Go语言的特 性移植到其他语言中,他会选择接口。可见接口在golang中的地位,及其对gloang这门语言所带来的活力。 golang中的interface是什么 接口相当于是一份契约,它规定了一个对象所能提供的一组操作。要理解golang中接口的概念我们最好还是先来看看别的现代语言是如何实现接口的。 C++没有提供interface这样的关键字,它通过纯虚基类实现接口,而java则通过interface关键字声明接口。它们有个共同特征就是一个类要实现该接口必须进行显示的声明,如下是java方式: interface IFoo { void Bar(); } class Foo implements IFoo ...阅读全文

博文 2015-01-26 20:00:02 justaipanda

Go语言学习记录之一(返回指针与返回值的区别)

先来一个返回指针的测试,结果跟想象一样 type A map[int]string type B struct { A c int } func main() { b := B{make(A), 10} NewB := func() *B { return &b } c := NewB() c.c = 100 c.A[1] = "3" fmt.Println(b, c) } /* output {map[1:3] 100} &{map[1:3] 100} */ 再试试直接返回值,这下的输出和想象中不一样了 type A map[int]string type B struct { A c int } func main() { a := B{make(A), 10} b := B{make(...阅读全文

博文 2015-10-09 11:00:11 inu1255

golang学习的点点滴滴:利用组合实现继承

package main import "fmt" type Base struct { Name string } func (b *Base) SetName(name string) { b.Name = name } func (b *Base) GetName() string { return b.Name } // 组合,实现继承 type Child struct { base Base // 这里保存的是Base类型 } // 重写GetName方法 func (c *Child) GetName() string { c.base.SetName("modify...") return c.base.GetName() } // 实现继承,但需要外部提供一个Base的实例...阅读全文

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

go语言的匿名函数

1.go语言匿名函数的用法 1-声明一个匿名函数 func(参数列表) 返回值列表 { 函数体... } 2-匿名函数的调用 package main import ( "fmt" ) func main() { //无参数直接加括号 func() int { var i int =5 fmt.Printf("func 1\n") return i }() //有参数,在括号里加参数 func(arge int) { fmt.Printf("func %d\n",arge) }(2) //也可以先赋给一个变量再调用 a := func() int { fmt.Printf("func 3\n") return 5 } a() } 程序输出: func 1 func 2 func 3 2.一个...阅读全文

博文 2015-06-17 23:00:50 plc_jianghao

Golang 的数组指针和指针数组

Golang 的数组指针和指针数组听上去有点乱不太好理解 但是自己动手敲一下 就一眼可以看出区别了 package main import "fmt" func main(){ x,y := 1, 2 var arr = [...]int{5:2} //数组指针 var pf *[6]int = &arr //指针数组 pfArr := [...]*int{&x,&y} fmt.Println(pf) fmt.Println(pfArr) } 可以看出代码中 数组指针 pf 的值得到的是一个指向arr 地址的一个指针 而指针数组 pfArr 则是一个数组内的元素全是指针类型 一下是打印出来的结果 &[0 0 0 0 0 2] [0xc04204a080 0xc04204a088...阅读全文

博文 2017-11-04 14:03:15 Mading_EVE

go语言reflect理解

不少文章在讲解GoLang的反射机制的时候都讲的比较复杂,这里简单总结下,做一个浅显的入门教程: 1、TypeOf方法跟ValueOf方法 TypeOf用来返回变量的类型,ValueOf用来返回变量的方法。 我们在初始化一个结构体的时候,有两种方式,var a Struct跟a :=new(Struct),其中,前者的类型是struct,后者的类型是指针。 package main import ( "fmt" "reflect" ) type MyStruct struct { name string } func (this *MyStruct) GetName() string { return this.name } func main() { a := new(MyStruct) ...阅读全文

博文 2016-10-17 10:00:10 tree2013

golang的指针到string,string到指针的转换

由于某个需求,需要如题的转换,废话不多说,直接贴代码了,其实挺丑了,备用了 func (this *Server) socketParserHandler(client *genTcpServer.Client, fullData []byte) { fmt.Println("original data is", client) strPointerHex := fmt.Sprintf("%p", unsafe.Pointer(client)) fmt.Println("connection is", strPointerHex) strPointerInt := fmt.Sprintf("%d", unsafe.Pointer(client)) fmt.Println("connectio...阅读全文

博文 2014-10-04 19:26:13 ziyouchutuwenwu

go语言初始化结构体new方法的区别

初学go,实例化一个对象的时候,搞得有点晕,以前学php,需要一个对象之间new一个即可,但是在go里面有三种方法,如下 a:=new(user) b:=&user{} c:=user{} 好似这三种方法都可以实现,这是什么原因呢,区别在哪里? ok,请看下面例子 package main import ( "fmt" ) type user struct { id int `1123` } func main() { a := &user{} a.id = 111 b := user{} b.id = 222 c := new(user) c.id = 333 fmt.Println(a, b, c) } 运行后结果如下 &{111} {222} &{333} 现在基本清楚,new(use...阅读全文

博文 2015-11-14 18:00:01 haitgo

golang struct结构体方法中的参数需要定义为指针类型

前几日写一个网页的简单计数器问题时发现,计数器居然永远为0,计数器不计数,见鬼了。。。 代码如下: type Counter struct { n int } func (ctr Counter) ServeHTTP(c http.ResponseWriter, req *http.Request) { fmt.Fprintf(c, "%08x\n", ctr) ctr.n++ fmt.Fprintf(c, "counter = %d\n", ctr.n) } func main() { http.Handle("/counter", new(Counter)) log.Fatal("ListenAndServe: ", http.ListenAndServe(":80", nil)) } ...阅读全文

博文 2014-10-04 19:26:11 songbohr

struct指针用完后如何释放

下面程序,先用InitReqData函数初始化一个map(map的value是一个struct指针),然后用freeReqData函数回收map中指定key的内容。 freeReqData函数应该怎么写,才既能把指定key从map中去掉,又保证相应的struct指针的释放,避免内存泄露? ``` package main type ReqData struct { Logid string } var( ArrReqData = make(map[string]*ReqData) ) func InitReqData(key string, logid string){ ArrReqData[key] = &ReqDat...阅读全文

golang flag包

go flag 包用来解析命令行参数,通过一个简单的例子来了解下 package main import ( "flag" "fmt" ) func main() { //参数1:命令行传递参数的名称 参数2:默认值 参数3:参数的说明 username := flag.String("name", "", "Input your name") //注意 username 是string 的指针 type: *string // 在例如: // var ip = flag.Int("flagname", 1234, "help message for flagname") //ip 的类型是: *int flag.Parse() fmt.Println("Hello,", *username...阅读全文

博文 2016-01-15 03:00:00 davin

如何保证在出现运行时异常(panic: runtime error:)时golang程序不退出?

在开发中遇到这样的一种情况,程序中出现了空指针异常:panic: runtime error: invalid memory address or nil pointer dereference,这个时候程序自动退出运行了!我知道golfing可以是用panic recover来实现异常的捕获,但是这种运行时异常要怎么捕获,这样才能保证程序不挂呢?求高手指教...阅读全文

uboot启动zImage(go)和uImage(bootm)分析

1.之间差异。bootm 加载linux镜像是加载uIamge,uIamge是由mkimage制作而来,和zIamge的差异是uIamge是zIamge压缩过的,bootm需要先对uIamge解压,解压地址为内核入口地址。当解压完成时uIamge和zIamge 几乎是相同的,具体差异可以论述。uboot目前只能支持uImage启动,不支持zImage启动2.bootm解压过程---------------------------------------------------------------------------## Booting image at 08808000 ...Image Name: Linux-2.6.14.7Image Type: ARM Linux Kernel...阅读全文

博文 2015-09-20 09:00:00 stonye

golang的指针receiver和非指针receiver的区别?

golang的指针receiver和非指针receiver的区别? 最大的区别应该是指针传递的是对像的引用,这样在方法里操作的时候可以动态修改对像的属性值。 非指针传递的是对像的拷贝。 这个应该和PHP的引用的用法差不多。 package main import ( "fmt" ) type Person struct { Name string Age int } func (p *Person) SayHi1() { p.Name = "leon1" } func (p Person) SayHi2() { p.Name = "leon2" } func main() { p1 := &Person{Name: "test", Age: 10} fmt.Println("name1 : ...阅读全文

博文 2015-06-17 20:05:15 leonpengweicn

golang积累-接口指针与结构体指针

对go做过开发的朋友都很熟悉interface。这几天在网上看到了篇文章,谈到了interface与nil判等的问题。题是好题,就进一步了解了一下。 原题如下: Nil接口并不是有Nil指针的接口 type Cat interface { Meow() } type Tabby struct {} func (*Tabby) Meow() { fmt.Println("meow") } func GetACat() Cat { var myTabby *Tabby = nil // Oops, we forgot to set myTabby to a real value return myTabby } func TestGetACat(t *testing.T) { if GetACa...阅读全文

博文 2016-10-03 10:00:02 qq_26981997

为什么 Go 语言把类型放在后面?

本文整理自知乎,原文作者 @林建入。 不是为了与众不同。而是为了更加清晰易懂。 Rob Pike 曾经在 Go 官方博客解释过这个问题(原文地址:http://blog.golang.org/gos-declaration-syntax),简略翻译如下(水平有限翻译的不对的地方见谅): 引言 Go语言新人常常会很疑惑为什么这门语言的声明语法(declaration syntax)会和传统的C家族语言不同。在这篇博文里,我们会进行一个比较,并做出解答。 C 的语法 首先,先看看 C 的语法。C 采用了一种聪明而不同寻常的声明语法。声明变量时,只需写出一个带有目标变量名的表达式,然后在表达式里指明该表达式本身的类型即可。比如: int x; 上面的代码声明了 x 变量,并且其类型为 int——即...阅读全文

博文 2015-01-20 10:00:01 zhang8058

Golang的值类型receiver和指针类型receiver

Golang的值类型和指针类型receiver一直让我比较混淆,在此做几个试验备忘 先看指针类型的receiver: package main import ( "fmt" ) type BasicEvent struct { EventId int } func (ev *BasicEvent) updateEventID(id int) { ev.EventId = id } func main() { ev1 := &BasicEvent{EventId: 1} fmt.Printf("before update id = %d\n", ev1.EventId) ev1.updateEventID(2) fmt.Printf("After update id = %d\n", ev1....阅读全文

博文 2015-04-23 15:00:01 miros

Go-指针、传值与传引用、垃圾回收

要点 Go使用的*、&、new()这些运算符,和C++的用法完全一样。 有传值和传引用/传地址的概念,和C++一样。 Go没有new对应的delete操作,而是采用Java一样的垃圾自动回收机制。 传引用或指针主要用于用户自定义类型。 示例 package main import "fmt" /* D:\examples>go run helloworld.go 10 100 5 100 D:\examples> */ func main() { i := 10 pass_by_value(i) fmt.Println(i) pass_by_reference(&i) fmt.Println(i) x := new(int) *x = 5 fmt.Println(*x) pass_by_re...阅读全文

博文 2016-09-06 10:00:04 u013344915

Golang数组Array

数组Array 定义数组的格式:var package main import ( "fmt" ) func main() { //数组的长度也是类型的一部分,因此具有不同长度的数组为不同类型 var a [2]int //定义长度为2的int型数组。 var b [1]int //长度为1的int型数组 b = a fmt.Println(b)//此时编译时不通过的 } 数组的长度也是类型的一部分,因此具有不同长度的数组为不同类型 package main import ( "fmt" ) func main() { a := [20]int{19: 1} //长度为20的int型数组,索引位为19的赋值为1 b := [...]int{0: 1, 1: 2, 2: 3} //3个点代表不...阅读全文

博文 2017-09-30 09:30:01 skymyyang

指向切片的指针取切片中的值得问题

package main import ( "fmt" ) func main() { //指向切片的指针 var p = new([]int) *p = append(*p, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0) for i, v := range *p { fmt.Println(i, v) } fmt.Println(len(*p)) fmt.Println(p[9]) } 上述代码的最后一句无法输出,我想问下,如果是指向数组的话,最后一句代码是可以输出的,而对于指向切片的指针,该怎...阅读全文

go语言的string和slice是值拷贝吗?

package main import "fmt" func main() { var str string = "12345" tmpstr := str fmt.Printf("%x %x\n", str, tmpstr) tmpstr = tmpstr + "x" fmt.Printf("%x %x\n", str, tmpstr) var a []byte = []byte("12345") b := a fmt.Printf("%x %x\n", a, b) b = append(b, 'a') fmt.Printf("%x %x\n", a, b) } 应该是指针拷贝, 上面的输出是 3132333435 3132333435 3132333435 313233343578 31...阅读全文

博文 2016-03-18 13:00:02 frank0712105003

Golang Context 详细介绍

Golang context 本文包含对context实现上的分析和使用方式,分析部分源码讲解比价多,可能会比较枯燥,读者可以直接跳过去阅读使用部分。 ps: 作者本着开源分享的精神撰写本篇文章,如果出现任何误差务必留言指正,作者会在第一时间内修正,共同维护一个好的开源生态,谢谢!!! 一、简介 作者所讲的context的包名称是: "golang.org/x/net/context" ,希望读者不要引用错误了。 在godoc中对context的介绍如下: Package context defines the Context type, which carries deadlines, cancelation signals, and other request-scoped values...阅读全文

博文 2018-06-07 15:30:02 cnblogs-wangzhipeng

go的隐藏字段的方法

虽然go的编译器会给receiver为值的方法自动实现一个receiver为指针的同名方法,但go的编译器并没有足够聪明 对于包含隐藏字段的某类型,其指针调用隐藏字段的方法是,只会考虑隐藏字段的类型(值/方法),是类似语法糖的东东,它不会因为你是用指针调用的,就选择指针的方法。 package main type A int func (a A) add() { a+=1 } func (a *A) inc() { *a+=1 } type B struct{ A b bool } func main() { x:=B{} y:=&x x.add() println(x.A) y.add() println(y.A) x.inc() println(x.A) y.inc() println(...阅读全文

博文 2014-10-04 19:25:59 刘地

Go语言中普通函数与方法的区别

1.对于普通函数,接收者为值类型时,不能将指针类型的数据直接传递,反之亦然。 2.对于方法(如struct的方法),接收者为值类型时,可以直接用指针类型的变量调用方法,反过来同样也可以。 以下为简单示例: package structTest //普通函数与方法的区别(在接收者分别为值类型和指针类型的时候) //Date:2014-4-3 10:00:07 import ( "fmt" ) func StructTest06Base() { structTest0601() structTest0602() } //1.普通函数 //接收值类型参数的函数 func valueIntTest(a int) int { return a + 10 } //接收指针类型参数的函数 func poi...阅读全文

博文 2015-06-17 23:02:21 books1958

golang里interface空指针

interface空指针不为nil 当把一个空指针对象赋值给一个interface后, var pi *int = nil var i interface{} i = pi fmt.Println(i == nil) // 结果为 false 这个不难理解,因为i = pi,不是将nil賳值给i,而是让i指向了pi这个对象。 简单翻了下源码,interface的定义应该是下面这两中的一个。 type iface struct { tab *itab data unsafe.Pointer } type eface struct { _type *_type data unsafe.Pointer } i = pi其实相当于i.data = unsafe.Pointer(&pi),而i == ...阅读全文

博文 2017-09-25 17:04:52 NeverLea

go语言值传递与址传递

go语言值传递与址传递: 值传递是对源结构体拷贝的操作; 址传递是对源结构体的操作; package main import ( "fmt" ) type BigStruct struct { C01 uint64 } func Invoke1(a *BigStruct) uint64 { a.C01++ return a.C01 } func Invoke2(a BigStruct) uint64 { a.C01++ return a.C01 } func (a *BigStruct) Invoke3() uint64 { a.C01++ return a.C01 } func (a BigStruct) Invoke4() uint64 { a.C01++ return a.C01 } ...阅读全文

博文 2014-10-04 19:26:38 xxtianxiaxing

Go语言指针编译速度的影响

自 http://golangtc.com/t/55fa90a5b09ecc7a420000a4 这段代码的编译时间,他的编译时间非常非常的长,非指针,至少我用了十几秒的时间,公司的老电脑 package main type BigData [1024*1024*1024]int64 func f(data BigData) { } func main() { var data BigData f(data) } 这段代码的编译时间 几乎可以瞬间编译完成,使用了指针 package main type BigData [1024*1024*1024]int64 func f(data *BigData) { } func main() { data := new(BigData) f(dat...阅读全文

博文 2015-09-22 03:00:01 rumia

Go-goroutine 不可滥用

goroutine 是go语言最大的创新,但这并不意味着我们可以随意使用。原因: 1 goroutine的指针传递是不安全的 2 goroutine增加了函数的危险系数 3 goroutine的滥用陷阱 处理方法 1 当启动一个goroutine的时候,如果一个函数必须要传递一个指针,但是函数层级很深,在无法保证安全的情况下,传递这个指针指向对象的一个克隆,而不是直接传递指针。 2 什么时候使用goroutine: 有两种思维逻辑会想到使用goroutine: 2.1 业务逻辑需要并发 比如一个服务器,接收请求,阻塞式的方法是一个请求处理完成后,才开始第二个请求的处理。其实在设计的时候我们一定不会这么做,我们会在一开始就已经想到使用并发来处理这个场景,每个请求启动一个goroutine为它服...阅读全文

博文 2015-12-21 13:00:00 lmxmimihuhu

[go语言]初学者需要注意的问题-map

1.直接对map对象使用[]操作符获得的对象不能直接修改状态 package main func main() { type person struct {age int} m := map[string]person{"steve":{10}} m["steve"].age = 100 // 编译错误:cannot assign to m["steve"].age } 2.通过查询map获得的对象是个拷贝,对此对象的修改不能影响原有对象的状态 package main func main() { type person struct {age int} m := map[string]person {"steve":{10}} p := m["steve"] p.age = 100 // ...阅读全文

博文 2014-10-29 14:21:58 stevewang

Golang中new和make的区别

总结几点: new会分配结构空间,并初始化为清空为零,不进一步初始化 new之后需要一个指针来指向这个结构 make会分配结构空间及其附属空间,并完成其间的指针初始化 make返回这个结构空间,不另外分配一个指针 例子new: var p *[]int = new([]int) 或 p := new([]int) 以上分配了一个slice结构,但是结构中的应该指向底层数组的ptr指针为空,故实际不能往这个slice里面存取数据 同时分配了一个指针p,也即(在32位系统中)占4个字节并存放slice结构的地址 例子make: var v []int = make([]int, 0) v := make([]int, 0) 以上分配了一个slice结构,且结构中的应该指向底层数组的ptr指针已经...阅读全文

博文 2015-05-21 17:00:01 ____追梦人

切片数组指针???切片指针数组???

``` func MyToString(my []*my) string { info := make([]string, 0, 5) for _, data := range (orderManage) { info.append(info, data.name) info.append(info, data.class) info.append(info, data.adde) } return string(info) } //其中my是我自己定义的类型,函数功能是:将[]*my里面的数据转化为string类型。 ``` Qes:...阅读全文

Golang回调函数实例二则

1.定义 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。 2.机制 定义一个回调函数 提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者 当特定的事件或条件发生时,调用者使用函数指针调用回调函数对事件进行处理 例1.这是一个简单的回调例子,调用函数test时,调用真正的实现函数add package main import "fmt" type Callback func(x, y int) int // 提供一个接口,让外部去实现 func test(x, ...阅读全文

博文 2017-07-27 02:06:18 iCaptain

Go 中的数据结构 -- Interface

Go 中的 interface 可以静态编译,动态执行,是最让我感到兴奋的一个特性。如果要让我推荐一个 Go 语言的特性给其他的语言,那我一定会推荐 interface。 本文是我对于 Go 语言中 interface 类型在 gc 编译器上实现的一些想法。Ian Lance Taylor 写了两篇关于 interface 类型在 gccgo 中实现的[文章](https://www.airs.com/blog/archives/277)。本文与之最大的不同是本文有一些图片可以更形象的说明原理。 在研究具体的实现原理之前,我们一起来看看 interface 需要支持什么功能。 ## 用法 Go 的 interface 让你可以像纯动态语言一样使用[鸭子类型](https://en.wikip...阅读全文

博文 2018-09-25 09:31:11 bizky

golang里如何将一个struct指针转换成slice

废话不说了,直接上代码 package main import "unsafe" import "fmt" func abc() { type T struct { a int b int c int } type SliceHeader struct { addr uintptr len int cap int } t := &T{a: 1, b: 2, c: 3} p := unsafe.Sizeof(*t) println(int(p)) sl := &SliceHeader{ addr: uintptr(unsafe.Pointer(t)), len: int(p), cap: int(p), } b := *(*[]byte)(unsafe.Pointer(sl)) println...阅读全文

博文 2015-06-18 19:00:34 HopingWhite

go学习笔记-go语言传值默认采用value还是reference?

看下面的程序 package main import "fmt" type Question struct { title string detail string } func (ques Question) Print() { fmt.Println(ques.title) } func (ques Question) Update2(title string) { ques.title = title } func (ques *Question) Update(title string) { ques.title = title } func main() { ques := Question{ title: "why", detail: "haha", } ques.Print()...阅读全文

博文 2015-12-31 03:00:00 inevermore