Golang flag包使用详解(一)

golang实战之flag包 age intid *int//通过传入变量地址的方式,绑定命令行参数到string变量flag.StringVar(&name, //第一个参数:存放值的参数地址“name”, //第二个参数:命令行参数的名称“匿名”, //第三个参数:命令行不输入时的默认值“您的姓名”) //第四个参数:该参数的描述信息,help命令时会显示//通过传入变量地址的方式,绑定命令行参数到int变量flag.IntVar(&age, //第一个参数:存放值的参数地址。 阅读详情

概述

flag包提供了一系列解析命令行参数的功能接口

命令行语法

命令行语法主要有以下几种形式

-flag //只支持bool类型
-flag=x
-flag x //只支持非bool类型

以上语法对于一个或两个‘-’号,效果是一样的,但是要注意对于第三种情况,只支持非bool类型,原因是碰到如下情况时

cmd -x *

*为0,false有可能表示一个文件名或文件,也有可能表示x标签的值为0或false,会产生二义性,因此规定第三种只支持非bool类型。对于整形flag,合法的值可以为1234, 0664,0x1234或负数等。对于布尔型flag,可以为1, 0, t, f, T, F,true, false, TRUE, FALSE, True, False等

命令行参数解析方法

使用flag主要包括以下几步

  1. 定义flag参数,有三种方式

    • 通过flag.String(), Bool(), Int() 等flag.Xxx()方法,该种方式返回一个相应的指针

      import "flag"
      var ip = flag.Int("flagname", 1234, "help message for flagname")
      
    • 通过flag.XxxVar()方法将flag绑定到一个变量,该种方式返回值类型,如

      var flagvar int
      func init() {
          flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname")
      }
      
    • 通过flag.Var()绑定自定义类型,自定义类型需要实现Value接口(Receives必须为指针),如

      flag.Var(&flagVal, "name", "help message for flagname")
      

      对于这种类型的flag,默认值为该变量类型的初始值

  2. 调用flag.Parse()解析命令行参数到定义的flag

    flag.Parse()
    

    解析函数将会在碰到第一个非flag命令行参数时停止,非flag命令行参数是指不满足命令行语法的参数,如命令行参数为cmd --flag=true abc则第一个非flag命令行参数为“abc”

  3. 调用Parse解析后,就可以直接使用flag本身(指针类型)或者绑定的变量了(值类型)

    fmt.Println("ip has value ", *ip)
    fmt.Println("flagvar has value ", flagvar)
    

    还可通过flag.Args(), flag.Arg(i)来获取非flag命令行参数

  4. 如果需要每个函数的详细demo,可参见Gopkg:flag

示例

  • 示例1: 获取“species” flag的值,默认为“gopher”

    var species = flag.String("species", "gopher", "the species we are studying")
    
  • 示例2: 两个flag共享同一个变量,一般用于同时实现完整flag参数和对应简化版flag参数,需要注意初始化顺序和默认值

    var gopherType string
    
    func init() {
      const (
        defaultGopher = "pocket"
        usage         = "the variety of gopher"
      )
      flag.StringVar(&gopherType, "gopher_type", defaultGopher, usage)
      flag.StringVar(&gopherType, "g", defaultGopher, usage+"(shorthand)")
    }
    
  • 示例3: 将flag绑定用户自定义类型。按我们先前所说,只需要实现Value接口,但实际上,如果需要取值的话,需要实现Getter接口,看下接口定义就明白了:

    type Getter interface {
      Value
      Get(string) interface{}
    }
    type Value interface {
      String() string
      Set(string) error
    }
    

    接下来,我们实现一个解析并格式化命令行输入的时间集合的例子,如下

    package main
    
    import (
      "errors"
      "flag"
      "fmt"
      "strings"
      "time"
    )
    
    type interval []time.Duration
    
    //实现String接口
    func (i *interval) String() string {
      return fmt.Sprintf("%v", *i)
    }
    
    //实现Set接口,Set接口决定了如何解析flag的值
    func (i *interval) Set(value string) error {
        //此处决定命令行是否可以设置多次-deltaT
      if len(*i) > 0 {
        return errors.New("interval flag already set")
      }
      for _, dt := range strings.Split(value, ",") {
        duration, err := time.ParseDuration(dt)
        if err != nil {
          return err
        }
        *i = append(*i, duration)
      }
      return nil
    }
    
    var intervalFlag interval
    
    func init() {
      flag.Var(&intervalFlag, "deltaT", "comma-separated list of intervals to use between events")
    }
    
    func main() {
      flag.Parse()
      fmt.Println(intervalFlag)
    }
    

    运行结果:

    //./commandLine -deltaT 61m,72h,80s
    [1h1m0s 72h0m0s 1m20s]

扩视机器视觉—Halcon机器视觉48个实战项目六(检测定位角度) 此项目halcon检测检测定位角度问题,并显示。 阅读详情

相关推荐

基于C#的跨平台上位机开发:一次编写,多平台运行

摘要: 本文探讨了如何利用C#进行跨平台上位机开发,以适配Windows、Linux、macOS等多平台需求。通过分析传统单平台开发的局限性(如API差异、硬件接口兼容性),提出基于.NET 5/6/7的解决方案,重点推荐Avalonia(类WPF的跨平台UI框架)和GtkSharp(基于GTK+)实现图形界面。同时,针对硬件通信需求,介绍了System.IO.Ports串口通信和LibUsbDotNet的跨平台支持,并强调多平台调试(VS Code、Docker)的重要性,最终实现一次编码、多端部署的高效

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1409

golang 使用时出现“flag redefined” 的错误

golang 使用时出现“flag redefined” 的错误1 错误如下2 原因 1 错误如下 2 原因 在同一个包下,使用了两次flag.Bool,且两个flag.Bool 中的name参数都设置为n,编译成exe执行时发生路径错误,将其中的一个flag.Bool的name参数改成别的,编译后可正常运行。 ...

sinat_20906149的博客 7436

脑机接口最新发展动态报告 (2024-2025)

脑机接口动态

高山 4106

golang 使用的使用出现“flag redefined” 的错误

场景:我一个远程代码仓库,一个本地代码仓库,我在做合并的时候,运行发现错误; 原因:是因为两个项目都用到glog包,用vendor进行管理,比如一个名为d(原始的名称)目录,包含了源代码,d1(修改后的名称)目录和d一样的只是名称少了1,在运行d的时候没有错误,而在d1时发现flag redefined的错误,因为d1的代码中使用到的包的路径落到了d的目录中,这个需要注意了! ...

weixin_37697675的博客 6173

ThingsKit物联网平台产品管理之物模型

物模型是ThingsKit物联网平台为产品定义的数据模型,用于描述产品的功能。本文介绍物模型相关概念和使用限制。

云腾五洲官方博客 1174

RabbitMq安装

本文详细介绍了在CentOS7系统上离线部署RabbitMQ4.3.2的完整流程。主要内容包括:1)准备RabbitMQ安装包、Erlang依赖和socat网络工具;2)安装系统编译依赖并编译安装Erlang;3)部署RabbitMQ服务,配置环境变量和socat依赖;4)启用Web管理插件并创建管理员账号;5)配置防火墙放行端口;6)设置Systemd开机自启服务;7)提供常用运维命令。文档特别强调离线部署注意事项,包括socat依赖、版本兼容性、账号安全及主机名配置等问题,为生产环境部署提供完整解决方案

sinat_25821779的博客 323

Go test 传递命令行参数及解析所遇到的错误及解决

Go test 传递命令行参数及解析所遇到的错误及解决 概述 这周的服务计算作业是使用 Golang 开发 selpg 命令行程序,selpg 程序详见 开发 Linux 命令行实用程序,笔者对其的 Golang 实现详见 gitee 在好不容易实现了 selpg 所需要的函数后,当然是要对其进行测试,但是在编写测试函数过程中,遇到了许多问题,经过一番摸索尝试后,才将其解决,在此将方法记录下来,和大家分享 以下将结合 selpg 中两个函数 ProcessArgs 和 ProcessInput 来说明 Go

Lance_of_Longinus的博客 3385

【RTD】AD7793驱动程序

AD7793完整驱动程序,支持两线、三线、四线RTD。

只要思想不滑坡,想法总比问题多。 6175

Go:flag包的入门级用法

一、大多数后端程序员多多少少都要和服务器打交道,服务器大多通过命令行去管理,想必大家在大家敲郭不少类似于 git --version的命令吧。可能你会好奇它是如何实现的。下面我将通过使用go语言的flag包实现类似于git --version这样的命令。 二、go flag go提供了flag包帮助我们实现解析命令行参数的功能 看个简单的例子 package main import ( "flag" "fmt" "strconv" ) func FlagVal() *int{ n := flag

windAlsoKindness的博客 777

用 SAML 2.0 Bearer Assertion 配置 ABAP OAuth 2.0 令牌交换

摘要: SAP系统集成中,身份跨系统传递是关键挑战。OAuth 2.0的SAML 2.0 Bearer Assertion grant机制通过SAML断言换取访问令牌,实现安全身份传递。配置核心在ABAP的SOAUTH2事务码,需绑定可信SAML身份提供商(IdP)并指定访问范围。实际应用中,需确保SSL加密传输,正确配置SAML IdP信任关系,并为OAuth客户端分配专用系统用户。常见问题包括证书不匹配、权限配置不当等,需分层控制权限边界以保障安全。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 837

Simulink仿真模块 -Scope

如果您将 Scope 模块放在具有锁定链接的库或者锁定的库中,当尝试打开示波器窗口时,Simulink 会显示错误。要显示某个库模块中的内部数据,请为库模块添加一个输出端口,然后将此端口连接到您模型中的 Scope 模块。当您在示波器内可视化多个基于帧的信号时,部分帧大小为 1 的信号采样可能不会显示。当在示波器内可视化多个基于帧的信号时,部分帧大小为 1 的信号采样可能不会显示。如果在仿真开始时波形视图关闭,则当在仿真后打开波形视图时,波形视图将显示附加的输入信号的仿真结果。

jk_101的博客 3791

Golang - Flag 包

flag, flagSet

yang_kaiyue的博客 783

高级数据库--作业及答案

中科大金培权老师的高级数据库课程作业及答案

一杯水果茶!足矣~ 1658

Go语言:flag包使用详解(一)

转载于文章Golang flag包使用详解(一),Go语言官方教程的地址为:https://golang.org/pkg/flag/#pkg-overview 概述 flag包提供了一系列解析命令行参数的功能接口 命令行语法 命令行语法主要有以下几种形式 -flag //只支持bool类型 -flag=x -flag x //只支持非bool类型 以上语法对于一个或两个‘-’号,效果是一样的,但...

freshman94的博客 4460

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

golang flag使用示例

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33724046的博客 129

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Go语言如何使用命令行程序

介绍在Go语言中如何使用命令行程序

禅与代码的艺术 436

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Go:获取命令行参数

一、Low B 方式 package main import ( "fmt" "os" ) func main() { fmt.Println("命令行的参数有", len(os.Args)) // 遍历 os.Args 切片,就可以得到所有的命令行输入参数值 for i, v := range os.Args { fmt.Printf("args[%...

weixin_34204057的博客 872

golang之flag包详解

在golang中有很多方法来处理命令行参数,简单情况下可以不使用任何库,直接使用os.Args;但是golang标准库提供了flag包来处理命令行参数;还有第三方提供的处理命令行参数的库cobra、cli。 flag包绑定解析参数有三种定义方式 flag.xxx() 例如:flag.Int, flag.String, 返回解析变量类型的指针 package main import ( "flag" "fmt" ) func main() { host := flag.Stri

weixin_42278305的博客 1万+

如何在Go中使用Flag包

标志使你的应用程序在更多的环境中更有用,因为它们让你的用户控制程序如何执行。为用户提供有用的默认值很重要,但也应该让他们有机会覆盖不适合他们情况的设置。你已经看到了flag包为用户提供了灵活的配置选项。你可以选择一些简单的标志,或者构建一组可扩展的子命令。无论哪种情况,使用flag包都将帮助您构建具有悠久历史的灵活和可脚本化命令行工具风格的实用程序。

码觉客的博客 1万+

Golang之flag包的使用

1.1 flag简介 import “flag” flag包实现了命令行参数的解析。 要求: 使用flag.String(), Bool(), Int()等函数注册flag,下例声明了一个整数flag,解析结果保存在*int指针ip里: import "flag" var ip = flag.Int("flagname", 1234, "help message for flagname") 如...

BigData_Mining的博客 2537

[Golang flag]命令行参数解析及flag包详解

这篇文章带大家学习了一遍golang提供的flag包,学完后就会各种花式写命令行程序了。

夏日白云的boke 7195

golang flag 包_如何在Go中使用Flag包

golang flag 包 介绍 (Introduction) Command-line utilities are rarely useful out of the box without additional configuration. Good defaults are important, but useful utilities need to accept configuration...

765

golang flag包使用笔记

本文原文地址:flag - 命令行参数解析 在写命令行程序(工具、server)时,对命令参数进行解析是常见的需求。各种语言一般都会提供解析命令行参数的方法或库,以方便程序员使用。如果命令行参数纯粹自己写代码来解析,对于比较复杂的,还是挺费劲的。在 go 标准库中提供了一个包:flag,方便进行命令行解析。 首先,我们看flag包可以做什么,它具有什么样的能力。 1.1 使用示例: 我们以 ng...

技术宅,专注云原生、Go、Linux、Java等技术分享,原创文章、效率工具、实战解决方案!关注我,了解互联网动态,学 IT 不迷路 1294

Go flag包使用详解

一. flag包用来做什么 不管是在linux还是windows下,都支持在程序运行的情况下传递命令行参数。如: ./demo -i 10 -b=true 关于如何将命令行的参数取出来,我们可以通过os包来实现。 通过range os.Args,我们可以取出所有的命令行参数,但是这种方法存在一定的局限性。这种方法没有将每一个参数的标志和其值映射起来(对于./demo -i 10 -b=true来说,-i是参数的标志,10是该标志的值)。 flag包相比os提供的取命令行参数方法相比,flag包在取

信仰的博客 975
上一篇: libevent源码笔记(三) 主要结构
下一篇: Elasticsearch中文搜索环境搭建
thulpf
博客等级 码龄16年 3粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值