草庐IT

pointer_traits

全部标签

pointers - Go 的指针何时取消引用自身

我最近才开始深入研究Go,我有一个主要的困惑点:我很难理解什么时候需要明确地取消引用指针。例如,我知道.运算符将处理取消引用指针ptr:=new(SomeStruct)ptr.Field="foo"//Automaticallydereferences在其他什么情况下会这样做?例如,它似乎与数组有关。ptr:=new([5][5]int)ptr[0][0]=1我在规范中找不到这个,指针部分很短,甚至没有涉及取消引用。任何关于取消引用go指针的规则的澄清都会很棒! 最佳答案 selectorexpression(例如x.f)这样做:S

pointers - 在Golang中将结构指针转换为接口(interface)指针

我有一个功能funcdoStuff(inout*interface{}){...}此函数的目的是能够将任何类型的指针视为输入。但是当我想用结构的指针调用它时,我遇到了错误。typeMyStructstruct{f1int}当调用doStuffms:=MyStruct{1}doStuff(&ms)我有test.go:38:cannotuse&ms(type*MyStruct)astype**interface{}inargumenttodoStuff我怎样才能使&ms与*interface{}兼容? 最佳答案 没有“指向接口(inte

pointers - Golang 基础结构和 new() 关键字

我正在学习golang,在阅读描述结构的章节时,我遇到了初始化结构的不同方法。p1:=passport{}varp2passportp3:=passport{Photo:make([]byte,0,0),Name:"Scott",Surname:"Adam",DateOfBirth:"Sometime",}fmt.Printf("%s\n%s\n%s\n",p1,p2,p3)虽然这些将结构的值打印为{}{}{ScottAdamSometime},下面的代码会打印一个&符号,因为它是一个引用。pointerp1:=&p3fmt.Printf("%s",pointerp1)pointerp

pointers - 如何跨包中的文件使用全局变量?

我的文件结构如下:models/db.gotypeDBstruct{*sql.DB}vardb*DBfuncinit(){dbinfo:=fmt.Sprintf("user=%spassword=%sdbname=%ssslmode=disable",DB_USER,DB_PASSWORD,DB_NAME)db,err:=NewDB(dbinfo)checkErr(err)rows,err:=db.Query("SELECT*FROMprofile")checkErr(err)fmt.Println(rows)}funcNewDB(dataSourceNamestring)(*DB,e

pointers - 使用指向数组的指针

我正在玩google的Go语言,我遇到了一些C语言中相当基本的东西,但我目前看到的文档中似乎没有涉及当我将指向slice的指针传递给函数时,我认为我们有一些方法可以访问它,如下所示:funcconv(x[]int,xlenint,h[]int,hlenint,y*[]int)fori:=0;i但是Go编译器不喜欢这样:sean@spray:~/dev$8gbroke.gobroke.go:8:invalidoperation:y[i+j](indexoftype*[]int)很公平-这只是一个猜测。我有一个相当简单的解决方法:funcconv(x[]int,xlenint,h[]int

string - 如何将 'string pointer' 转换为 Golang 中的字符串?

是否可以从指向字符串的指针中获取字符串值?我正在使用gooptpackage处理标志解析并且包仅返回*string。我想使用这些值来调用map中的函数。ExamplevarstrPointer=new(string)*strPointer="string"functions:=map[string]func(){"string":func(){fmt.Println("works")},}//Dosomethingtogetthestringvaluefunctions[strPointerValue]()返回./prog.go:17:14:cannotusestrPointer(ty

pointers - 调用 struct 函数给出 "cannot refer to unexported field or method"

我有一个类似这样的结构:typeMyStructstruct{Idstring}和功能:func(m*MyStruct)id(){//doingsomethingwithidhere}我还有另一个这样的结构:typeMyStruct2struct{m*MyStruct}现在我有一个函数:funcfoo(str*MyStruct2){str.m.id()}但我在编译时遇到错误:str.m.idundefined(cannotrefertounexportedfieldormethodmypackage.(*MyStruct)."".id如何正确调用这个函数?

pointers - Go中的临时地址?

处理这种情况的最干净的方法是什么:funca()string{/*doesn'tmatter*/}b*string=&a()这会产生错误:cannottaketheaddressofa()我的理解是,如果获取了地址,Go会自动将局部变量提升到堆中。这里很清楚,要取返回值的地址。处理这个问题的惯用方法是什么? 最佳答案 地址运算符返回一个指向具有“家”的东西的指针,例如。一个变量。您的代码中表达式的值是“无家可归”。如果你真的需要一个*string,你必须分两步完成:tmp:=a();b:=&tmp请注意,虽然*string有完全有效

pointers - 为什么接口(interface)不能用指针接收器实现

我很困惑为什么编译失败:impossibletypeassertion:FazdoesnotimplementFoo(Barmethodhaspointerreceiver)如果我将Faz.Bar的接收器设为Faz值而不是Faz指针,那么它编译得很好,但我认为拥有指针接收器总是更好,这样值就不会被复制?packagemainimport("log")funcmain(){foo:=New().(Faz)log.Println(foo)}typeFoointerface{Bar()string}funcNew()Foo{return&Faz{}}typeFazstruct{}func(f

pointers - "<type> is pointer to interface, not interface"困惑

我有这个问题,我觉得有点奇怪。看看这段代码:packagecoreinterfacestypeFilterInterfaceinterface{Filter(s*string)bool}typeFieldFilterstruct{KeystringValstring}func(ff*FieldFilter)Filter(s*string)bool{//Somecode}typeFilterMapInterfaceinterface{AddFilter(f*FilterInterface)uuid.UUIDRemoveFilter(iuuid.UUID)GetFilterByID(iuu