Go学习(六):函数

golang编译器的//go:解析 文章目录//go:noescape//go:nosplit//go:linkname localname [importpath.name]//go:nowritebarrierrec//go:yeswritebarrierrec//go:noinline//go:norace 在阅读golang源码时经常会遇到以//go:开头的注释,其目的就是告诉编译器如何编译这段代码。 //go:noesca... 阅读详情

目录

函数定义

参数

返回值

匿名函数

闭包、递归

 javascript的闭包

 Go的闭包

 递归

延迟调用(defer)

defer特性:

defer用途:

异常处理

单元测试

压力测试


函数定义

    • 无需声明原型。
    • 支持不定 变参。
    • 支持多返回值。
    • 支持命名返回参数。 
    • 支持匿名函数和闭包。
    • 函数也是一种类型,一个函数可以赋值给变量。

    • 不支持 嵌套 (nested) 一个包不能有两个名字一样的函数。
    • 不支持 重载 (overload) 
    • 不支持 默认参数 (default parameter)。

 函数是第一类对象,可作为参数传递。建议将复杂签名定义为函数类型,以便于阅读??(我感觉好难看懂)

package main

import "fmt"

func test(fn func() int) int {
    return fn()
}
// 定义函数类型。
// 没有函数体的函数声明,这表示该函数不是以Go实现的。这样的声明定义了函数标识符
type FormatFunc func(s string, x, y int) string 

func format(fn FormatFunc, s string, x, y int) string {
    return fn(s, x, y)
}

func main() {
    s1 := test(func() int { return 100 }) // 直接将匿名函数当参数。

    s2 := format(func(s string, x, y int) string {
        return fmt.Sprintf(s, x, y)
    }, "%d, %d", 10, 20)

    println(s1, s2)
}
 100 10, 20

参数

在默认情况下,Go 语言使用的是值传递,即在调用过程中不会影响到实际参数。

注意1:无论是值传递,还是引用传递,传递给函数的都是变量的副本,不过,值传递是值的拷贝。引用传递是地址的拷贝,一般来说,地址拷贝更为高效。而值拷贝取决于拷贝的对象大小,对象越大,则性能越低。

注意2:map、slice、chan、指针、interface默认以引用的方式传递。

不定参数传值 就是函数的参数不是固定的,后面的类型是固定的。(可变参数)

Golang 可变参数本质上就是 slice。只能有一个,且必须是最后一个。

在参数赋值时可以不用用一个一个的赋值,可以直接传递一个数组或者切片,特别注意的是在参数后加上“…”即可。

  func myfunc(args ...int) {    //0个或多个参数
  }

  func add(a int, args…int) int {    //1个或多个参数
  }

  func add(a int, b int, args…int) int {    //2个或多个参数
  }
//其中args是一个slice,我们可以通过arg[index]依次访问所有参数,通过len(arg)来判断传递参数的个数.

  //函数的参数和每个参数的类型都不是固定的
  func myfunc(args ...interface{}) {
  }

使用 slice 对象做变参时,必须展开。(slice...) 

package main

import (
    "fmt"
)

func test(s string, n ...int) string {
    var x int
    for _, i := range n {
        x += i
    }

    return fmt.Sprintf(s, x)
}

func main() {
    s := []int{1, 2, 3}
    res := test("sum: %d", s...)    // slice... 展开slice
    println(res)
}

返回值

没有参数的 return 语句返回各个返回变量的当前值。这种用法被称作“裸”返回。仅应当用在像下面这样的短函数中

package main

import (
    "fmt"
)

func add(a, b int) (c int) {
    c = a + b
    return  //返回c,命名返回参数可被同名局部变量遮蔽,此时需要显式返回。
}

func calc(a, b int) (sum int, avg int) {
    sum = a + b
    avg = (a + b) / 2

    return
}

func main() {
    var a, b int = 1, 2
    c := add(a, b)
    sum, avg := calc(a, b)
    fmt.Println(a, b, c, sum, avg)
}

Golang返回值不能用容器对象接收多返回值。只能用多个变量,或 "_" 忽略。 

多返回值可直接作为其他函数调用实参

package main

func test() (int, int) {
    return 1, 2
}

func add(x, y int) int {
    return x + y
}

func sum(n ...int) int {
    var x int
    for _, i := range n {
        x += i
    }

    return x
}

func main() {
    println(add(test()))
    println(sum(test()))
}

 命名返回参数允许 defer 延迟调用通过闭包读取和修改。

package main

//没看过defer不理解
func add(x, y int) (z int) {
    defer func() {
        z += 100
    }()

    z = x + y
    return
}
//显式 return 返回前,会先修改命名返回参数。
func add2(x, y int) (z int) {
    defer func() {
        println(z) // 输出: 203
    }()

    z = x + y
    return z + 200 // 执行顺序: (z = z + 200) -> (call defer) -> (return)
}

func main() {
    //输出:103
    println(add(1, 2)) 
    //输出:
    //203
    //203
    println(add2(1, 2)) 
}

匿名函数

Go 学习笔记(16)— 函数(02)[函数签名、有名函数、匿名函数、调用匿名函数、匿名函数赋值给变量、匿名函数做回调函数]_函数签名和匿名函数-优快云博客

Golang匿名函数可赋值给变量,做为结构字段,或者在 channel 里传送。

package main

func main() {
    // --- function variable ---
    fn := func() { println("Hello, World!") }
    fn()

    // --- function collection ---
    fns := [](func(x int) int){
        func(x int) int { return x + 1 },
        func(x int) int { return x + 2 },
    }
    println(fns[0](100))

    // --- function as field ---
    //什么写法,匿名结构体?匿名函数作为方法
    d := struct {
        fn func() string
    }{
        fn: func() string { return "Hello, World!" },
    }
    println(d.fn())

    // --- channel of function ---
    //还没学
    fc := make(chan func() string, 2)
    fc <- func() string { return "Hello, World!" }
    println((<-fc)())
}

闭包、递归

闭包=函数+引用环境

闭包是由函数和与其相关的引用环境组合而成的实体。闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。

闭包可以用来完成信息隐藏,并进而应用于需要状态表达的某些编程范型中

 javascript的闭包

<!DOCTYPE html>
<html lang="zh">
<head>
    <title></title>
</head>
<body> 
</body>
</html>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type="text/javascript"></script>
<script>
function a(){
    var i=0;
    function b(){
        console.log(++i);
        document.write("<h1>"+i+"</h1>");
    }
    return b;
}

$(function(){
    //函数a()的内部函数b()被函数a()外的一个变量引用的时候,就创建了一个闭包
    var c=a();
    c();
    c();
    c();
    //不会收回a()所占用的资源,因为a()的内部函数b()的执行需要依赖a()中的变量i

    //如果a()返回的不是函数b(),情况就完全不同了。因为a()执行完后,b()没有被返回给a()的外界,只是被a()所引用,而此时a()也只会被b()引 用,因此函数a()和b()互相引用但又不被外界打扰(被外界引用),函数a和b就会被GC回收。所以直接调用a();是页面并没有信息输出。
    //a(); //不会有信息输出
    document.write("<h1>=============</h1>");
    //c()跟c2()引用的是不同的环境,在调用i++时修改的不是同一个i
    var c2=a();
    c2();
    c2();
});

</script>

 Go的闭包

package main

import (
    "fmt"
)

func a() func() int {
    i := 0
    b := func() int {
        i++
        fmt.Println(i)
        return i
    }
    return b
}

func main() {
    c := a()
    c()
    c()
    c()

    a() //不会输出i
}

//输出:
//1
//2
//3

闭包复制的是原对象指针,会有延迟引用现象。 

【精选】Golang 循环体中的闭包和go func变量取值问题[延迟绑定]_goroutine闭包赋值-优快云博客

返回2个闭包 

package main

import "fmt"

// 返回2个函数类型的返回值
func test01(base int) (func(int) int, func(int) int) {
	// 定义2个函数,并返回
	// 相加
	add := func(i int) int {
		base += i
		return base
	}
	// 相减
	sub := func(i int) int {
		base -= i
		return base
	}
	// 返回
	return add, sub
}

func main() {
	//f1是加的函数,f2是减的函数
	f1, f2 := test01(10)
	// base一直是没有消

	fmt.Println(f1(1), f2(2))
	// 此时base是9

	fmt.Println(f1(3), f2(4))
}

//输出:
//11 9
//12 8

 递归

package main

import (
	"fmt"
)

func factorial(i int) int {
	if i <= 1 {
		return 1
	}
	return i * factorial(i-1)
}

func fibonaci(i int) int {
	if i == 0 {
		return 0
	} else if i == 1 {  //else if要写在同一行
		return 1
	}
	return fibonaci(i-1) + fibonaci(i-2)
}
func main() {
	//递归
	//1、数字阶乘
	var i int = 5
	fmt.Printf("Factorial of %d is %d\n", i, factorial(i))

	//2、斐波那契数列
	for j := 0; j < 10; j++ {
		fmt.Printf("%d\n", fibonaci(j))
	}

}

延迟调用(defer)

defer特性:
    1. 关键字 defer 用于注册延迟调用。
    2. 这些调用直到 return 前才被执。因此,可以用来做资源清理。
    3. 多个defer语句,按先进后出的方式执行。  栈?
    4. defer语句中的变量,在defer声明时就决定了。
defer用途:
    1. 关闭文件句柄
    2. 锁资源释放
    3. 数据库连接释放

defer 碰上闭包

package main

import "fmt"

func main() {
    var whatever [5]struct{}
    for i := range whatever {
        defer func() { fmt.Println(i) }()
    }
}

//输出
//4
//4
//4
//4
//4

 defer后面的语句在执行的时候,函数调用的参数会被保存起来,但是不执行。也就是复制了一份。但是并没有说struct这里的this指针如何处理,通过这个例子可以看出go语言并没有把这个明确写出来的this指针当作参数来看待。

package main

import "fmt"

type Test struct {
    name string
}

func (t *Test) Close() {
    fmt.Println(t.name, " closed")
}
func main() {
    ts := []Test{{"a"}, {"b"}, {"c"}}
    for _, t := range ts {
        defer t.Close() //从断点看这句直到函数结束才执行,当时的t是c
    }
}
    c  closed
    c  closed
    c  closed
package main

import "fmt"

type Test struct {
    name string
}

func (t *Test) Close() {
    fmt.Println(t.name, " closed")
}
func Close(t Test) {
    t.Close()
}
func main() {
    ts := []Test{{"a"}, {"b"}, {"c"}}
    for _, t := range ts {
        defer Close(t)  //每次循环都会执行
    }
    //效果相同
    //for _, t := range ts {
    //    t2 := t
    //    defer t2.Close()
    //}

}
    c  closed
    b  closed
    a  closed

多个 defer 注册,按 FILO 次序执行 ( 先进后出 )。哪怕函数或某个延迟调用发生错误,这些调用依旧会被执行。

package main

func test(x int) {
    defer println("a")
    defer println("b")

    defer func() {
        println(100 / x) // div0 异常未被捕获,逐步往外传递,最终终止进程。
    }()

    defer println("c")
}

func main() {
    test(0)
}
    c
    b
    a
    panic: runtime error: integer divide by zero

延迟调用参数在注册时求值或复制,可用指针或闭包 "延迟" 读取。

package main

func test() {
    x, y := 10, 20

    defer func(i int) {
        println("defer:", i, y) // y 闭包引用
    }(x) // x 被复制,这时候x还是10

    x += 10
    y += 100
    println("x =", x, "y =", y)
}

func main() {
    test()
}
//x = 20 y = 120
//defer: 10 120

 如果 defer 后面跟的不是一个 closure 最后执行的时候我们得到的并不是最新的值

package main

import (
    "errors"
    "fmt"
)

func foo(a, b int) (i int, err error) {
    defer fmt.Printf("first defer err %v\n", err)
    defer func(err error) { fmt.Printf("second defer err %v\n", err) }(err)
    defer func() { fmt.Printf("third defer err %v\n", err) }()
    if b == 0 {
        err = errors.New("divided by zero!")
        return
    }

    i = a / b
    return
}

func main() {
    foo(2, 0)
}
//third defer err divided by zero!
//second defer err <nil>
//first defer err <nil>
package main

import "fmt"

func foo() (i int) {

    i = 0
    defer func() {
        fmt.Println(i)
    }()

    return 2  //是闭包会更新i,且return将i的值修改为2了
}

func main() {
    foo()
}
//2
package main

import (
    "fmt"
)
//run() 的声明是没有问题,因为在test函数运行完成后它才会被调用。
func test() {
    var run func() = nil
    defer run()  // defer 函数会被执行且会因为值为 nil 而产生 panic 异常
    fmt.Println("runs")
}

func main() {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println(err)
        }
    }()
    test()
}
//runs
//runtime error: invalid memory address or nil pointer dereference

 不忽视f.Close()的正确写法(别犯不检查错误)

package main

import "os"

func do() (err error) {
    f, err := os.Open("book.txt")
    if err != nil {
        return err
    }

    if f != nil {
        defer func() {
            if ferr := f.Close(); ferr != nil {
                err = ferr
            }
        }()
    }

    // ..code...

    return nil
}

func main() {
    do()
}

释放相同的资源

如果你尝试使用相同的变量释放不同的资源,那么这个操作可能无法正常执行。

 遇到问题再说

异常处理

异常的使用场景简单描述:Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理。

暂时先不学

单元测试

压力测试

【Golang学习之旅】Go 语言基础语法概览 ✅ 适合人群: Golang 新手 | 后端开发者 | 面试求职者✅ 文章亮点: 语法详解 + 实战代码 + 高质量示例✅ 目标: 10 分钟快速掌握 Golang 基础语法,助你高效写项目!Go 语言(Golang)是Google开发的一门静态强类型并发支持强语法简洁的编程语言,广泛应用于后端开发云计算微服务区块链等领域。🔹 Go 语言的 4 大核心特点:✅ 语法简洁(减少代码冗余,开发高效)✅ 高性能(比 Python 快,比 Java 简单) 阅读详情

相关推荐

Go语言算法实战教程:深入学习Golang算法

通过理解树的遍历和重构方法以及特殊形态的二叉树,我们能够在面对各种树相关问题时,选择恰当的数据结构和算法,以达到最优的性能表现。

weixin_42608299的博客 1233

Golang 学习之路六:函数

Golang学习: Go 编程语言 函数基础

kaliopensourcextu 1285

高德地图+Three.js实战:手把手教你打造数字农场3D可视化大屏(附完整源码)

本文详细介绍了如何利用高德地图JS API与Three.js技术栈,构建一个功能强大的数字农场3D可视化大屏。文章从技术选型、架构设计出发,深入讲解了坐标对齐、图层管理、性能优化等核心工程实践,并提供了完整的模块化代码示例,旨在为智慧农业及类似场景的3D地理可视化项目提供一套可复用的解决方案。

k8s6orchestrator的博客 890

Go学习(六): 函数使用

1.函数申明 1.1 声明语法 func funcName( param type ) (output1 type1, output2 type2) {   //这里是处理逻辑代码   //返回多个值    return value1, value2 } 1.2 语法解析 func: 函

weixin_39001207的博客 197

方法二:旋转机械动平衡精度计算

本文以实际案例为基础,系统阐述基于ISO 1940标准的动平衡精度G GG等级计算方法。通过角速度转换、许用剩余不平衡量e p e r e_{per}e per ​ 推导及G GG等级公式应用,结合惯性力偶矩、转子质量等参数,得出某转子系统的动平衡精度为G 40 G40G40。文中详细解析了公式原理与参数单位转换要点,并附完整ISO 1940动平衡等级参考表,为工程师提供从理论到实践的完整解决方案。研究结果表明,该方法可有效量化旋转机械的平衡精度,适用于风机、泵类等中低速设备的设计与调试,对提升设备运行

weixin_46153372的博客 921

一、Abaqus CAE 入门操作(薄膜应力计算)

一、Abaqus CAE 入门操作(薄膜应力计算)

A20802013的博客 4370

Go语言学习六:指针与传递到函数的指针

package main import ( "fmt" ) const MAX int = 3 func main() { var a int = 20 var ip *int /* 声明指针变量 */ ip = &a ip = &a /* 指针变量的存储地址 */ fmt.Printf("a 变量的地址是: %x\n", &a) /* 指针变量的存储地址 */ fm

风哥有点田 1788

玉米群体遗传分析实战:如何用IQtree和VCF文件快速构建系统发育树(附避坑指南)

本文详细介绍了如何利用IQtree和VCF文件进行玉米群体遗传分析,并快速构建可靠的系统发育树。文章重点解析了从VCF格式转换到PHYLIP格式的实用技巧,强调了使用ASC模型校正SNP数据偏差的重要性,并提供了完整的参数设置、常见报错解决方案及结果评估指南,帮助研究者高效完成分析并规避常见陷阱。

leaf8的博客 607

go语言学习-函数(六)

转载自:https://golangbot.com/functions/ 什么是函数 函数是执行特定任务的代码块。函数接受输入,对输入执行一些计算并生成输出。 函数声明 在 Go 中声明一个函数的语法为: func functionname(parametername type) returntype { //function body } 函数声明以func关键字开头,后面是函数名称。接...

这个名字想了很久 323

第18届全国大学生智能汽车竞赛四轮车开源讲解【2.5】-- 图像处理实战:从二值化到边缘检测的工程优化

本文深入讲解了第18届全国大学生智能汽车竞赛四轮车开源项目中图像处理的核心实战技术。文章聚焦于二值化与边缘检测两大关键环节,详细对比了大津法与索贝尔算子的工程应用与优化策略,并分享了遮光、偏振片等物理抗干扰技巧,旨在帮助参赛者构建稳定高效的图像预处理流水线,为赛道识别奠定坚实基础。

weixin_29279047的博客 100

PDF.js实现分片加载问题

PDF.js实现分片加载问题。

qq_32822693的博客 4977

GO开篇:手握Java走进Golang的世界

Go简介、Go和Java的对比

健身变秃,coding变强 1万+

PY32F406K1CU6+I2C+ AT24C64 基本配置

【代码】PY32F406K1CU6+I2C+ AT24C64 基本配置。

sam的博客 90

Go-Golang学习总结笔记

资源 某hub会审核不通过,自己去找吧 书籍 网站 基础 go官方中文网 菜鸟教程 C语言网 go语言中文网 golang系列 视频 基础 安装 依赖管理 数据类型 变量和常量 流程控制 函数 包 面向对象编程 提高 ...

关注网络安全、云原生安全 2万+

[VT虚拟化驱动]安装DPC回调检测CPU对VT的支持

文章目录前言一、驱动基本框架二、安装DPC回调三、检测CPU对VT的支持本章代码def.h:DriverEntry.cpputil.cpp 前言 对于VT的介绍网上有很多详细的介绍,这里不再赘述,只需要知道它有比操作系统还高的权限,可以利用这一点进行某些操作,如内存隐藏, 无痕HOOK ,MSR HOOK, 调试或者反调试, 这里直奔主题 一、驱动基本框架 虚拟机设置里虚拟化引擎设置: 新建一个空的WDM工程,平台设置为x64平台,右键属性——>Inf2Cat——>Run Inf2Cat设置

吾无法无天的博客 3908

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

golang go:linkname 的使用

这两天看go的源码,突然发现很多函数都是汇编写的go去调用的时候通过在函数上添加  //go:linkname xxx   yyy  等形式进行调用。 由于go是按照首字母大小写决定是否可以被外部包引用的。所以,如果我们想方位某个包中的私有成员,就需要用到go:linkname了,也就是说我们可以通过 //go:linkname localname linkname 这种方式将本地的私有函数/变...

wyfhist的专栏 5764

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

从Java到Go:Java工程师的Golang学习指南

作为一名Java工程师,你可能已经习惯了Java的面向对象编程、强大的生态系统以及丰富的工具链。然而,随着Go语言(Golang)在云计算、微服务和并发编程领域的崛起,学习Go语言成为了一个非常有价值的选择。本文将通过对比Java和Go语言的方式,帮助你快速掌握Go语言的核心概念,并通过详细的案例讲解,帮助你理解两者之间的异同。 Go 对比: Go 对比: Go 对比: Go 对比:Java通过类和接口实现多线程编程,或者使用包中的高级并发工具。 Go Go语言通过实现并发,是轻量级的线程,由Go运

SunnyRivers 1751

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【六袆-Golang】Golang:安装与配置Delve进行Go语言Debug调试

Delve是一个开源的Go语言调试器,它提供了丰富的功能,包括设置断点、单步执行、查看变量值等。Delve支持在本地和远程调试Go程序,使得开发者能够更方便地定位和解决代码中的问题。官方地址:github.com/go-delve/delve。

六祎的博客 1934

详解Golang中的go mod以及Golang包

本文介绍了Golang中的包管理和使用。主要内容包括:1) 包的三种类型(系统内置包、自定义包和第三方包);2) Go1.11后引入的gomod包管理工具及其常用命令;3) 自定义包的创建规则和导入方式;4) init()函数的特性和执行顺序;5) 第三方包的使用流程,包括查找、安装和依赖管理。文中重点说明了如何通过gomod管理项目依赖,以及如何定义和使用自定义包,同时介绍了匿名导入和包别名等实用技巧。

m0_75163045的博客 1610

【新人系列】Golang 入门(六):函数基础

go 函数支持普通函数、匿名函数、闭包。函数本身可以当做变量匿名函数、闭包函数可以满足接口//调用函数注意:函数传递传递的时候是值传递,go 语言中全部都是值传递。在 go 语言中,返回值的定义是可以返回多个的,并且可以选择是否定义返回值的名字。return //如果定义了名字,那此处默认返回定义好的变量sum和err返回注意:返回值中,如果第一个定义了名字,后面的类型也必须定义名字。

Newin2020的博客 2301

函数恢复的秘密:golang_loader_assist如何定位runtime_morestack并还原上千个Go函数

> 把Go程序拖进IDA Pro,函数窗口里却只有寥寥几个`sub_XXXX`,真正的业务逻辑全部"隐身"?这几乎是每个Go逆向新手都会撞上的墙。开源工具 **golang_loader_assist** 正是为此而生:它是一份专为IDA Pro打造的Go二进制逆向辅助脚本,核心使命就是**定位runtime_morestack、回溯交叉引用还原被隐藏的函数边界,并借助符号表一次性还原上千个Go函

gitblog_00109的博客 736

Golang 学习七(Go 函数)

文章目录1. 基础函数2. 函数参数3. 函数作为实参4. 函数闭包5. 函数方法 函数是基本的代码块,用于执行一个任务。 Go 程序中最少有一个 main() 函数。 可以通过函数来划分不同的功能,逻辑上每个函数执行的是指定的任务。 函数声明告诉了编译器函数的名称,返回类型和参数。 Go 中的标准库提供了多种可动用的内置的函数。例如:len() 函数可以接受不同类型参数并返回该类型的长度。如果传入的是字符串则返回字符串的长度,如果传入的是数组,则返回数组中包含的元素个数。 1.

shenyuanhaojie的博客 1398

Golang 生态学习

虽然 Go 在人工智能领域不如 Python 那样流行,但由于其出色的性能和并发支持,Go 也开始被用于一些 AI 和机器学习(ML)项目,尤其是对于需要高并发、高性能的任务,Go 可以提供优势。• 《Go语言圣经》(The Go Programming Language):这是学习 Go 语言的经典书籍,涵盖了 Go 的所有基础内容。它被广泛应用于供应链、金融等行业的区块链解决方案。:Go 的并发模型(goroutines 和 channels)是 Go 的强项,学习并发编程是使用 Go 的重要步骤。

A_Tevens的博客 1515

Go语言学习笔记—golang函数

golang 函数

qq_39280718的博客 592

golang学习教程

了解GolangGolang起源于2007年,并在2009年正式对外发布。Golang是一种编译型、静态类型的语言,具有垃圾回收功能。Golang的语法简洁明了,支持并发编程,具有强大的标准库和工具链。安装Golang从Golang官方网站下载并安装Golang。安装完成后,通过运行go version命令验证Golang是否成功安装。

chengxuyuan66666的博客 1670

为什么劝你要学习Golang以及GO语言(Go语言知识普及)

为什么劝你要学习Golang以及GO语言

m0_69234258的博客 4973
上一篇: Go学习(五):流程控制
下一篇: Go学习(七):方法、面向对象
Lay_XZ
博客等级 码龄5年 29粉丝 14原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值