Go——os包详解(二)

目录

3、Get系列函数

3.1 func Getegid() int
  • 参数列表:无
  • 返回值:
    • int 调用者的有效用户组id
  • 功能说明:这个函数主要是返回调用者的有效用户组id
3.2 func Getenv(key string) string
  • 参数列表
    • key 环境变量的key
  • 返回值:
    • string 返回环境变量的key对应的值
  • 功能说明:这个函数主要是根据key来获取相当环境变量的值
3.3 func Geteuid() int
  • 参数列表:无
  • 返回值:
    • int 调用者的有效用户id
  • 功能说明:这个函数主要是返回调用者的有效用户id
3.4 func Getgid() int
  • 参数列表:无
  • 返回值:
    • int 调用者的用户组id
  • 功能说明:这个函数主要是返回调用者的用户组id
3.5 func Getgroups() ([]int, error)
  • 参数列表:无
  • 返回值:
    • []int 调用者所属用户组的所有id
    • error 返回错误信息对象
  • 功能说明:这个函数主要是返回调用者所属用户组的所有id
3.6 func Getpagesize() int
  • 参数列表:无
  • 返回值:
    • int 返回系统内在的大小,单位为MB
  • 功能说明:这个函数主要是返回系统内存的大小
3.7 func Getpid() int
  • 参数列表:无
  • 返回值:
    • int 返回调用者进程id
  • 功能说明:这个函数主要是返回调用者进程id
3.8 func Getppid() int
  • 参数列表:无
  • 返回值:
    • int 返回调用者的父进程id
  • 功能说明:这个函数主要是返回调用者的父进程id
3.9 func Getuid() int
  • 参数列表:无
  • 返回值:- int 调用者的用户id
  • 功能说明:这个函数主要是返回调用者的用户id
3.10 func Getwd() (pwd string, err error)
  • 参数列表:无
  • 返回值:
    • pwd 当前目录
    • err 返回错误信息对象
  • 功能说明:这个函数主要是返回当前目录
func main() {
	fmt.Printf("%d\n", os.Getegid()) //20

	fmt.Printf("%s\n", os.Getenv("LANG")) //zh_CN.UTF-8

	fmt.Printf("%d\n", os.Geteuid()) //501

	fmt.Printf("%d\n", os.Getgid()) //20

	ids, err := os.Getgroups()
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}
	fmt.Printf("%v\n", ids) //[20 12 61 79 80 81 98 33 100 204 250 395 398 399 400 701]

	fmt.Printf("%d\n", os.Getpagesize()) //4096

	fmt.Printf("%d\n", os.Getpid()) //2101

	fmt.Printf("%d\n", os.Getppid()) //584

	fmt.Printf("%d\n", os.Getuid()) //501

	pwd, err := os.Getwd()
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}
	fmt.Printf("The current directory is: %s\n", pwd)
}

4、Is系列函数

4.1 func IsExist(err error) bool
  • 参数列表
    • err 错误信息对象
  • 返回值:
    • bool 是否为文件或目录已存在的错误
  • 功能说明:这个函数主要是判断一个错误是否为文件或目录已存在的错误
4.2 func IsNotExist(err error) bool
  • 参数列表
    • err 错误信息对象
  • 返回值:
    • bool 是否为文件或目录不存在的错误
  • 功能说明:这个函数主要是判断一个错误是否为文件或目录不存在的错误
4.3 func IsPathSeparator(c uint8) bool
  • 参数列表
    • c 判断字符
  • 返回值:
    • bool 是否为目录路径分割符
  • 功能说明:这个函数主要是判断一个字符是否为目录路径分割符
4.4 func IsPermission(err error) bool
  • 参数列表
    • err 错误信息对象
  • 返回值:
    • bool 是否为无权限错误
  • 功能说明:这个函数主要是判断一个错误是否为无权限错误
func main() {
	fmt.Printf("%t\n", os.IsExist(os.ErrExist))                //true
	fmt.Printf("%t\n", os.IsExist(errors.New("Custom Error"))) //false

	fmt.Printf("%t\n", os.IsNotExist(os.ErrNotExist))             //true
	fmt.Printf("%t\n", os.IsNotExist(errors.New("Custom Error"))) //false

	fmt.Printf("%t\n", os.IsPathSeparator('/')) //true
	fmt.Printf("%t\n", os.IsPathSeparator('.')) //false

	fmt.Printf("%t\n", os.IsPermission(os.ErrPermission))           //true
	fmt.Printf("%t\n", os.IsPermission(errors.New("Custom Error"))) //false
}

5、Process系列函数

5.1 func FindProcess(pid int) (p *Process, err error)
  • 参数列表
    • pid 进程pid
  • 返回值:
    • 返回p 返回进程结构体指针
    • 返回err 返回error错误对象信息
  • 功能说明:这个函数主要是通过进程pid查找一个进程对象
5.2 func (p *Process) Kill() error
  • 参数列表
  • 返回值:
    • 返回error 返回error错误对象信息
  • 功能说明:这个函数主要是杀死一个进程
5.3 func (p *Process) Release() error
  • 参数列表
  • 返回值:
    • 返回error 返回error错误对象信息
  • 功能说明:这个函数主要是释放一个进程相关的资源
5.4 func (p *Process) Signal(sig Signal) error
  • 参数列表
    • sig 系统信号
  • 返回值:
    • 返回error 返回error错误对象信息
  • 功能说明:这个函数主要是给一个进程发送一个信号
5.5 func StartProcess(name string, argv []string, attr *ProcAttr) (*Process, error)
  • 参数列表
    • name 执行命令
    • argv 命令参数
    • attr 命令相关环境参数
  • 返回值:
    • 返回*Process 返回进程结构体指针
    • 返回error 返回error错误对象信息
  • 功能说明:这个函数主要是启动一个进程
5.6 func (p *Process) Wait() (*ProcessState, error)
  • 参数列表
  • 返回值:
    • 返回*ProcessState 返回进程状态结构体指针
    • 返回error 返回error错误对象信息
  • 功能说明:这个函数主要是等待一个进程执行完成
func main() {
	processFindTest()

	processKillTest()

	processReleaseTest()

	processSignal()

	processStartTest()

	processWait()
}

func processFindTest() {
	p, err := os.FindProcess(12)
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}
	fmt.Printf("Process info: %+v\n", p)
}

func processKillTest() {
	attr := &os.ProcAttr{
		Files: []*os.File{os.Stdin, os.Stdout},
		Env:   os.Environ(),
	}
	p, err := os.StartProcess("/bin/pwd", []string{"/bin/pwd"}, attr)
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}
	fmt.Printf("Process info: %+v\n", p)
	if err := p.Kill(); err != nil {
		fmt.Printf("Error: %v\n", err)
	}
}

func processReleaseTest() {
	attr := &os.ProcAttr{
		Files: []*os.File{os.Stdin, os.Stdout},
		Env:   os.Environ(),
	}
	p, err := os.StartProcess("/bin/pwd", []string{"/bin/pwd"}, attr)
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}
	fmt.Printf("Process info: %+v\n", p)
	if err := p.Release(); err != nil {
		fmt.Printf("Error: %v\n", err)
	}
}

func processSignal() {
	attr := &os.ProcAttr{
		Files: []*os.File{os.Stdin, os.Stdout},
		Env:   os.Environ(),
	}
	p, err := os.StartProcess("/bin/pwd", []string{"/bin/pwd"}, attr)
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}
	fmt.Printf("Process info: %+v\n", p)
	if err := p.Signal(os.Kill); err != nil {
		fmt.Printf("Error: %v\n", err)
	}
}

func processStartTest() {
	attr := &os.ProcAttr{
		Files: []*os.File{os.Stdin, os.Stdout},
		Env:   os.Environ(),
	}
	p, err := os.StartProcess("/bin/pwd", []string{"/bin/pwd"}, attr)
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}
	fmt.Printf("Process info: %+v\n", p)
}

func processWait() {
	attr := &os.ProcAttr{
		Files: []*os.File{os.Stdin, os.Stdout},
		Env:   os.Environ(),
	}
	p, err := os.StartProcess("/bin/pwd", []string{"/bin/pwd"}, attr)
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}
	ps, _ := p.Wait()
	fmt.Printf("Process stat: %+v\n", ps)
}

6、ProcessState系列函数

6.1 func (p *ProcessState) Exited() bool
  • 参数列表
  • 返回值:
    • 返回bool 进程是否已退出
  • 功能说明:这个函数主要是判断一个进程是否已退出
6.2 func (p *ProcessState) Pid() int
  • 参数列表
  • 返回值:
    • 返回int 已退出进程的pid
  • 功能说明:这个函数主要是获取已退出进程的pid
6.3 func (p *ProcessState) String() string
  • 参数列表
  • 返回值:
    • 返回string 进程状态的字符串
  • 功能说明:这个函数主要是获取进程状态的字符串
6.4 func (p *ProcessState) Success() bool
  • 参数列表
  • 返回值:
    • 返回bool 进程是否已成功退出
  • 功能说明:这个函数主要是判断一个进程是否已成功退出
6.5 func (p *ProcessState) Sys() interface{}
  • 参数列表
  • 返回值:
    • 返回interface{}
  • 功能说明:这个函数主要是获取进程的退出信息
6.6 func (p *ProcessState) SystemTime() time.Duration
  • 参数列表
  • 返回值:
    • 返回time.Duration 进程系统cpu使用时间
  • 功能说明:这个函数主要是获取的进程的系统cpu使用时间
6.7 func (p *ProcessState) SysUsage() interface{}
  • 参数列表
  • 返回值:
    • 返回interface{}
  • 功能说明:这个函数主要是获取进程资源使用情况
6.8 func (p *ProcessState) UserTime() time.Duration
  • 参数列表
  • 返回值:
    • 返回time.Duration 进程用户cpu使用时间
  • 功能说明:这个函数主要是获取的进程的用户cpu使用时间
func main() {
	stateExitedTest()

	statePidTest()

	stateStringTest()

	stateSuccessTest()

	stateSysTest()

	stateSystemTimeTest()

	stateSysUsageTest()

	stateUserTime()
}

func stateExitedTest() {
	attr := &os.ProcAttr{
		Files: []*os.File{os.Stdin, os.Stdout},
		Env:   os.Environ(),
	}
	p, err := os.StartProcess("/bin/pwd", []string{"/bin/pwd"}, attr)
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}
	ps, _ := p.Wait()
	fmt.Printf("Process has been exited?: %t\n", ps.Exited())
}

func statePidTest() {
	attr := &os.ProcAttr{
		Files: []*os.File{os.Stdin, os.Stdout},
		Env:   os.Environ(),
	}
	p, err := os.StartProcess("/bin/pwd", []string{"/bin/pwd"}, attr)
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}
	ps, _ := p.Wait()
	fmt.Printf("Process pid is: %d\n", ps.Pid())
}

func stateStringTest() {
	attr := &os.ProcAttr{
		Files: []*os.File{os.Stdin, os.Stdout},
		Env:   os.Environ(),
	}
	p, err := os.StartProcess("/bin/pwd", []string{"/bin/pwd"}, attr)
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}
	ps, _ := p.Wait()
	fmt.Printf("Process stat: %s\n", ps.String())
}

func stateSuccessTest() {
	attr := &os.ProcAttr{
		Files: []*os.File{os.Stdin, os.Stdout},
		Env:   os.Environ(),
	}
	p, err := os.StartProcess("/bin/pwd", []string{"/bin/pwd"}, attr)
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}
	ps, _ := p.Wait()
	fmt.Printf("Process has been exited successfully?: %t\n", ps.Success())
}

func stateSysTest() {
	attr := &os.ProcAttr{
		Files: []*os.File{os.Stdin, os.Stdout},
		Env:   os.Environ(),
	}
	p, err := os.StartProcess("/bin/pwd", []string{"/bin/pwd"}, attr)
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}
	ps, _ := p.Wait()
	fmt.Printf("Process exit status: %+v\n", ps.Sys())
}

func stateSystemTimeTest() {
	attr := &os.ProcAttr{
		Files: []*os.File{os.Stdin, os.Stdout},
		Env:   os.Environ(),
	}
	p, err := os.StartProcess("/bin/pwd", []string{"/bin/pwd"}, attr)
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}
	ps, _ := p.Wait()
	fmt.Printf("Process system cpu time: %+v\n", ps.SystemTime())
}

func stateSysUsageTest() {
	attr := &os.ProcAttr{
		Files: []*os.File{os.Stdin, os.Stdout},
		Env:   os.Environ(),
	}
	p, err := os.StartProcess("/bin/pwd", []string{"/bin/pwd"}, attr)
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}
	ps, _ := p.Wait()
	fmt.Printf("Process resource usage: %+v\n", ps.SysUsage())
}

func stateUserTime() {
	attr := &os.ProcAttr{
		Files: []*os.File{os.Stdin, os.Stdout},
		Env:   os.Environ(),
	}
	p, err := os.StartProcess("/bin/pwd", []string{"/bin/pwd"}, attr)
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}
	ps, _ := p.Wait()
	fmt.Printf("Process user cpu time: %+v\n", ps.UserTime())
}

7、其它函数

7.1 func Clearenv()
  • 参数列表:无
  • 返回值:无
  • 功能说明:这个函数主要是清空当前环境变量
7.2 func Environ() []string
  • 参数列表:无
  • 返回值:[]string 环境变量
  • 功能说明:这个函数主要是获取当前环境变量
7.3 func Exit(code int)
  • 参数列表:code 程序退出状态码
  • 返回值:无
  • 功能说明:这个函数主要是立即终止当前程序,defer的函数不会运行
7.4 func Expand(s string, mapping func(string) string) string
  • 参数列表
    • s 需要替换的字符串
    • mapping 替换规则函数
  • 返回值:string 替换后的字符串
  • 功能说明:这个函数主要是把一个字符串里带 v a r 或 var或 var{var}这样的字符串按自定义的规则替换成自己想要的字符串,如果没有对应的,则替换成空
7.5 func ExpandEnv(s string) string
  • 参数列表
    • s 需要替换的字符串
  • 返回值:string 替换后的字符串
  • 功能说明:这个函数主要是把一个字符串里带 v a r 或 var或 var{var}这样的字符串替换成当前环境变量中的内容,如果没有对应的,则替换成空
7.6 func Hostname() (name string, err error)
  • 参数列表:无
  • 返回值:
    • name hostname
    • err 返回错误信息对象
  • 功能说明:这个函数主要是返回机器的hostname
7.7 func Lchown(name string, uid, gid int) error
  • 参数列表
    • name 修改的文件名
    • uid 用户id
    • gid 用户组id
  • 返回值:
    • 返回error 返回错误信息对象
  • 功能说明:这个函数主要是修改一个文件的所属用户和用户组,如果文件为一个链接,修改的则是链接文件本身
7.8 func Link(oldname, newname string) error
  • 参数列表
    • oldname 源文件名
    • newname 目标文件名
  • 返回值:
    • 返回error 返回错误信息对象
  • 功能说明:这个函数主要是给一个文件建立一个硬链接
7.9 func (e *LinkError) Error() string
  • 参数列表:无
  • 返回值:
    • 返回string 返回LinkError的字符串形式
  • 功能说明:这个函数主要是获取LinkError的字符串形式
7.10 func Readlink(name string) (string, error)
  • 参数列表
    • name 链接名
  • 返回值:
    • string 目标文件
    • error 返回错误信息对象
  • 功能说明:这个函数主要是返回一个链接的目标文件
func main() {
	//fmt.Printf("The path is: %+v\n", os.Environ())
	//os.Clearenv()
	//fmt.Printf("Now the path is: %+v\n", os.Environ()) //Now the path is: []

	//fmt.Printf("running...\n")
	//defer fmt.Printf("defer function\n")
	//os.Exit(1)
	//fmt.Printf("finished\n")

	mapping := func(s string) string {
		m := map[string]string{"hello": "world", "go": "perfect program language"}
		return m[s]
	}
	str := "Golang is$not a $go in the ${hello}!"
	fmt.Printf("%s\n", os.Expand(str, mapping)) //Golang is a perfect program language in the world!

	s := "The language path is: $LANG"
	fmt.Printf("%s\n", os.ExpandEnv(s)) //The language path is: zh_CN.UTF-8

	name, err := os.Hostname()
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}
	fmt.Printf("The hostname is: %s\n", name)

	lchownTest()

	if err := os.Link("Hello.go", "Lhello.go"); err != nil {
		fmt.Printf("Error: %v\n", err)
	}
	fmt.Printf("Lhello.go has created!\n")

	le := &os.LinkError{
		Op:  "ln",
		Old: "old",
		New: "new",
		Err: errors.New("ln Error!"),
	}
	fmt.Printf("%s\n", le.Error())

	link, err := os.Readlink("src")
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	fmt.Printf("%s\n", link)
}

func lchownTest() {
	fi, err := os.Stat("Hello.go")
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	fmt.Printf("Hello.go: uid=%d, gid=%d\n", fi.Sys().(*syscall.Stat_t).Uid, fi.Sys().(*syscall.Stat_t).Gid)

	err = os.Lchown("Hello.go", 99, 99) //nobody, nobody
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}

	fi, err = os.Stat("Hello.go")
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	fmt.Printf("Now Hello.go: uid=%d, gid=%d\n", fi.Sys().(*syscall.Stat_t).Uid, fi.Sys().(*syscall.Stat_t).Gid)
}
7.11 func Mkdir(name string, perm FileMode) error
  • 参数列表
    • name 目录名
    • perm 权限
  • 返回值:
    • 返回error 返回错误信息对象
  • 功能说明:这个函数主要是新建一个指定权限的目录
7.12 func MkdirAll(path string, perm FileMode) error
  • 参数列表
    • path 目录路径
    • perm 权限
  • 返回值:
    • 返回error 返回错误信息对象
  • 功能说明:这个函数主要是按文件目录路径新建目录,如果路径中的上一级目录不存在,会自动创建
7.13 func NewSyscallError(syscall string, err error) error
  • 参数列表
    • syscall 系统调用名
    • err 错误信息对象
  • 返回值:
    • 返回error 返回SyscallError对象
  • 功能说明:这个函数主要是新建SyscallError对象
7.14 func (e *PathError) Error() string
  • 参数列表:无
  • 返回值:
    • 返回string 返回PathError的字符串形式
  • 功能说明:这个函数主要是获取PathError的字符串形式
7.15 func Remove(name string) error
  • 参数列表
    • name 文件或目录名
  • 返回值:
    • 返回error 返回错误信息对象
  • 功能说明:这个函数主要是删除一个文件或目录
7.16 func RemoveAll(name string) error
  • 参数列表
    • name 文件或目录名
  • 返回值:
    • 返回error 返回错误信息对象
  • 功能说明:这个函数主要是删除一个文件或目录(包括子目录)
7.17 func Rename(oldname, newname string) error
  • 参数列表
    • oldname 原文件名
    • newname 新文件名
  • 返回值:
    • 返回error 返回错误信息对象
  • 功能说明:这个函数主要是给一个文件重命名
7.18 func SameFile(fi1, fi2 FileInfo) bool
  • 参数列表
    • fi1 文件信息
    • fi2 文件信息
  • 返回值:
    • 返回bool 两个信息是否相同
  • 功能说明:这个函数主要是判断两个文件信息是否相同
7.19 func Setenv(key, value string) error
  • 参数列表
    • key 环境变量名
    • value 环境变量名的值
  • 返回值:
    • 返回error 返回错误信息对象
  • 功能说明:这个函数主要是设置一个环境变量
7.20 func Symlink(oldname, newname string) error
  • 参数列表
    • oldname 文件名
    • newname 新链接名
  • 返回值:
    • 返回error 返回错误信息对象
  • 功能说明:这个函数主要是给一个文件创建一个软链接
7.21 func (e *SyscallError) Error() string
  • 参数列表:无
  • 返回值:
    • 返回string 返回SyscallError的字符串形式
  • 功能说明:这个函数主要是获取SyscallError的字符串形式
7.22 func TempDir() string
  • 参数列表:无
  • 返回值:
    • 返回string 系统的tmp目录
  • 功能说明:这个函数主要是获取系统的tmp目录
7.23 func Truncate(name string, size int64) error
  • 参数列表
    • name 文件名
    • size 目标长度,单位为byte
  • 返回值:
    • 返回error 返回错误信息对象
  • 功能说明:这个函数主要是截短一个文件到新的长度
func main() {
	if err := os.Mkdir("hello_go", 0777); err != nil {
		fmt.Printf("Error: %v\n", err)
	}
	fmt.Printf("hello_go has been created!\n")

	if err := os.MkdirAll("hello_go/world", 0777); err != nil {
		fmt.Printf("Error: %v\n", err)
	}
	fmt.Printf("hello_go/world has been created!\n")

	fmt.Printf("%s\n", os.NewSyscallError("custom", errors.New("something wrong")))

	pe := &os.PathError{
		Op:   "cp",
		Path: "/oh/my/god",
		Err:  errors.New("path does'n exists!"),
	}
	fmt.Printf("%s\n", pe.Error())

	err := os.Remove("Hello.go")
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	fmt.Printf("Hello.go has been removed!\n")

	err = os.RemoveAll("hello_go/world")
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	fmt.Printf("hello_go/world has been removed!\n")

	err = os.Rename("Hello.go", "World.go")
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	fmt.Printf("Hello.go has been renamed to World.go!\n")

	fi1, err := os.Stat("Hello.go")
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}
	fi2, err := os.Stat("World.go")
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}
	fmt.Printf("%t\n", os.SameFile(fi1, fi2))
	fmt.Printf("%t\n", os.SameFile(fi1, fi1))

	fmt.Printf("Path of go is: %s\n", os.Getenv("go"))
	if err := os.Setenv("go", "/path/to/go"); err != nil {
		fmt.Printf("Error: %v", err)
	}
	fmt.Printf("Now Path of go is: %s\n", os.Getenv("go"))

	if err := os.Symlink("Hello.go", "Lhello.go"); err != nil {
		fmt.Printf("Error: %v", err)
		return
	}
	fmt.Printf("The Hello.go's  symbolic link Lhello.go has been created!\n")

	se := &os.SyscallError{
		Syscall: "/xx",
		Err:     errors.New("Syscall Error!"),
	}
	fmt.Printf("%s\n", se.Error())

	fmt.Printf("The temp dir is: %s\n", os.TempDir())

	fi, err := os.Stat("Hello.go")
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}
	fmt.Printf("The Hello.go's size is: %d\n", fi.Size())

	if err = os.Truncate("Hello.go", 10); err != nil {
		fmt.Printf("Error: %v\n", err)
	}

	fi, err = os.Stat("Hello.go")
	if err != nil {
		fmt.Printf("Error: %v\n", err)
	}
	fmt.Printf("Now the Hello.go's size is: %d\n", fi.Size())
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值