目录
go指针语法及viper库使用中的寻址问题
首页 后端开发 Golang 在使用Go语言和viper库时,为什么传递指针的指针是必要的?

在使用Go语言和viper库时,为什么传递指针的指针是必要的?

Apr 02, 2025 pm 04:00 PM
go语言 ai 为什么 igs

go指针语法及viper库使用中的寻址问题

在使用go语言进行编程时,理解指针的语法和使用方法至关重要,尤其是在与第三方库如viper结合使用时,可能会遇到一些需要深入理解的问题。今天我们要探讨的问题是关于在viper库的使用中,如何正确地传递参数,以及为什么传递一个指针的指针是必要的。

在我们的项目中有几个模块:setting、section、global和main。具体代码如下:

setting模块:

type setting struct {
    vp *viper.viper
}

func newsetting() (*setting, error) {
    vp := viper.new()
    vp.setconfigname("config")
    vp.addconfigpath("configs/")
    vp.setconfigtype("yaml")
    err := vp.readinconfig()
    if err != nil {
        return nil, err
    }

    return &setting{vp: vp}, nil
}
登录后复制

section模块:

type serversettings struct {
    runmode      string
    httpport     string
    readtimeout  time.duration
    writetimeout time.duration
}

func (s *setting) readsection(k string, v interface{}) error {
    err := s.vp.unmarshalkey(k, v)
    if err != nil {
        return err
    }

    return nil
}
登录后复制

global模块:

var serversetting *setting.serversettings
登录后复制

main模块:

setting, err := setting.newsetting()

setting.readsection("server", &global.serversetting)
登录后复制

现在,如果在main模块中将第二行修改为setting.readsection("server", global.serversetting),会报错result must be addressable (a pointer)。这是为什么呢?

问题在于,global.serversetting已经是一个指针,为什么在调用readsection方法时,还需要传递它的地址呢?

在viper库的源码中有这样的说明:

// newdecoder returns a new decoder for the given configuration. once
// a decoder has been returned, the same configuration must not be used
// again.
func newdecoder(config *decoderconfig) (*decoder, error) {
    val := reflect.valueof(config.result)
    if val.kind() != reflect.ptr {
        return nil, errors.new("result must be a pointer")
    }

    val = val.elem()
    if !val.canaddr() {
        return nil, errors.new("result must be addressable (a pointer)")
    }
}
登录后复制

从这段代码可以看出,传递的参数不仅需要是一个指针,还需要是可以寻址的(can be addressable)。当你传递一个结构体的指针时,它本身并不能被寻址,因此会导致错误。

为了验证这一点,我们可以看一下下面的例子:

package main

import (
    "fmt"
    "reflect"
)

var a *db

type db struct {
}

func main() {
    val := reflect.valueof(a)
    val = val.elem()
    fmt.println(val.canaddr())

    val = reflect.valueof(&a)
    val = val.elem()
    fmt.println(val.canaddr())
}
登录后复制

运行这段代码会得到如下输出:

false
true
登录后复制

这表明传递a本身(即一个指针)时,其元素无法被寻址,而传递&a(即指针的指针)时,其元素是可以被寻址的。

因此,在使用readsection方法时,我们需要传递&global.serversetting,因为这样传递的是一个指针的地址,它是可以被寻址的,从而满足viper库的要求。

以上是在使用Go语言和viper库时,为什么传递指针的指针是必要的?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1666
14
CakePHP 教程
1425
52
Laravel 教程
1327
25
PHP教程
1273
29
C# 教程
1252
24
2025最安全交易所TOP5:黑U避坑指南,资金100%保命法则 2025最安全交易所TOP5:黑U避坑指南,资金100%保命法则 May 08, 2025 pm 08:27 PM

在加密货币交易领域,交易所的安全性始终是用户关注的重点。2025年,经过多年的发展和演变,一些交易所凭借其卓越的安全措施和用户体验脱颖而出。本文将详细介绍2025年最安全的五大交易所,并提供如何避开黑U(黑客攻击用户)的实用指南,确保您的资金100%安全。

GO的未来:趋势和发展 GO的未来:趋势和发展 May 02, 2025 am 12:01 AM

go'sfutureisbrightwithtrendslikeMprikeMprikeTooling,仿制药,云 - 纳蒂维德象,performanceEnhancements,andwebassemblyIntegration,butchallengeSinclainSinClainSinClainSiNgeNingsImpliCityInsImplicityAndimimprovingingRornhandRornrorlling。

了解GO界面:综合指南 了解GO界面:综合指南 May 01, 2025 am 12:13 AM

Gointerfacesaremethodsignaturesetsthattypesmustimplement,enablingpolymorphismwithoutinheritanceforcleaner,modularcode.Theyareimplicitlysatisfied,usefulforflexibleAPIsanddecoupling,butrequirecarefulusetoavoidruntimeerrorsandmaintaintypesafety.

2025年十大数字虚拟币交易APP排行 十大数字币交易所app汇总 2025年十大数字虚拟币交易APP排行 十大数字币交易所app汇总 May 08, 2025 pm 05:24 PM

2025年十大数字虚拟币交易APP排行:1. Binance:全球领先,提供高效交易和多种金融产品。2. OKX:创新多样,支持多种交易类型。3. Huobi:稳定可靠,服务优质。4. Coinbase:新手友好,界面简洁。5. Kraken:专业交易者首选,工具强大。6. Bitfinex:高效交易,交易对丰富。7. Bittrex:安全合规,监管合作。

欧意OKX6.118.0版本最新下载教程 欧意OKX6.118.0版本最新下载教程 May 07, 2025 pm 06:51 PM

欧意OKX6.118.0版本最新下载教程:1、点击文章中快捷链接;2、点击下载即可(如果是网页用户请先进行信息注册)。最新安卓版本v6.118.0优化了部分功能和体验,让交易更容易。立即更新App,感受更加极致的交易体验。

全球十大支持多链交易的加密货币平台2025年权威发布 全球十大支持多链交易的加密货币平台2025年权威发布 May 08, 2025 pm 07:15 PM

根据 2025 年权威机构的最新评估和行业趋势,以下是全球十大支持多链交易的加密货币平台,结合交易量、技术创新、合规性及用户口碑综合分析:

了解GO中的初始功能:目的和用法 了解GO中的初始功能:目的和用法 May 01, 2025 am 12:16 AM

purposeoftheInitfunctionoIsistoInitializeVariables,setUpConfigurations,orperformneccesSetarySetupBeforEtheMainFunctionExeCutes.useInitby.UseInitby:1)placingitinyourcodetorunautoamenationally oneraty oneraty oneraty on inity in ofideShortAndAndAndAndForemain,2)keepitiTshortAntAndFocusedonSimImimpletasks,3)

欧意OKX5.1最新版本下载 欧意OKX5.1最新版本下载 May 07, 2025 pm 06:48 PM

欧意OKX6.118.0版本最新下载教程:1、点击文章中快捷链接;2、点击下载即可(如果是网页用户请先进行信息注册)。最新安卓版本v6.118.0优化了部分功能和体验,让交易更容易。立即更新App,感受更加极致的交易体验。

See all articles