首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

100天精通Golang(基础入门篇)——第21天:Go语言面向对象(OOP)核心概念解析

它没有有效的名、姓,也没有有效的保留细节。在其他的OOP语言中,比如java,这个问题可以通过使用构造函数来解决。使用参数化构造函数可以创建一个有效的对象。 go不支持构造函数。...在go中,它是一个命名一个函数的约定,它创建了一个T类型的值给NewT(parameters)。这就像一个构造函数。...通过这样做,我们成功地导出了employee结构并阻止了其他包的访问。将未导出的结构的所有字段都导出为未导出的方法是很好的做法,除非有特定的需要导出它们。...由于我们不需要在包之外的任何地方使用employee struct的字段,所以我们也没有导出所有字段。 由于employee是未导出的,所以不可能从其他包中创建类型employee的值。...,在使用构造函数的位置,使用New(parameters)的方法即可。

15710

Go 语言一次性定时器使用方式和实现原理

01 介绍 在 Go 语言标准库 time 包中的 Timer 类型,它是表示单一事件的计时器,也就是说它是一次性定时器。...创建 Timer,入参是定时器的等待时间,时间到达时,发送当前时间到 channel中。...func AfterFunc(d Duration, f func()) *Timer 使用 func AfterFunc 创建 Timer,入参是定时器等待时间,和时间到达时执行的函数。...03 实现原理 我们在源码中查看 Timer 的数据结构,发现它包含两个字段,其中一个是可导出字段 C,这是一个 Time类型的 chan;另一个是不可导出字段 r,这是一个 runtimeTimer...Golang 语言的多种变量声明方式和使用场景 Golang 语言中基础同步原语 Mutex 和 RWMutex 的区别 Golang 语言怎么使用 panic 函数?

76020
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Golang 基础之基础语法梳理 (二)

    x 中接收, 忽略值 关闭 调用内建 close 函数来关闭通道 close(ch) 关闭后的通道有以下特点: 对一个关闭的通道再发送值就会导致panic 对一个关闭的通道进行接收会一直获取值直到通道为空...单向通道 有的时候我们会将通道作为参数在多个任务函数间传递,很多时候我们在不同的任务函数中使用通道都会对其进行限制,比如限制通道在函数中只能发送或只能接收。...在函数传参及任何赋值操作中将双向通道转换为单向通道是可以的,但反过来是不可以的。 指针 介绍 区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针。...Go语言中的指针需要先知道3个概念:指针地址、指针类型和指针取值。 Go语言中的函数传参都是值拷贝,当我们想要修改某个变量的时候,我们可以创建一个指向该变量地址的指针变量。...一个结构体可能同时包含导出和未导出的成员。 一个命名为S的结构体类型将不能再包含S类型的成员:因为一个聚合的值不能包含它自身。(该限制同样适用于数组。) 结构体类型的零值是每个成员都是零值。

    69060

    牛客网_Go语言相关练习_判断&选择题(6)

    主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。...特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。 而golang没有相关的构造函数定义,只能通过new来创建构造函数。 ?...Go语言中的map是无序的组合。 ? X字段在从结构体实例编码到JSON数据格式的时候,使用x作为名字,这可以看作是一种重命名的方式。 ?...序列化通常将类型结构传入标准库或第三方包,类型结构中没有大写的变量未导出,对第三方包不可见,无法进行任何操作,依旧是默认的零值。 ? 指针是引用类型。主要引用对方的地址。 ? 是目录名。 ?...Make只用来创建slice,map,channel,其中map使用前必须初始化。append可直接动态扩容slice,而map不行。 map在使用前必须初始化。

    99910

    Go 问答汇总篇 二

    补充一点,在回答中没有提到的。 在实现 map 到 struct 的通用方法时,我们比较容易想到支持基础类型,但对于结构体类型而言,可能性太多,如何更灵活地解决问题?...这里面有个相对重要的转化公式,在需要考虑平润年的时候稍微有点复杂。 不多介绍了,具体自己看回答吧。 golang 中时候用指针什么时候用普通对象?...golang中哪些引用类型的指针在声明时不用加&号,哪些在函数定义的形参和返回值类型中不用*号标注 与前面问题类似,具体看回答。...golang 中如何禁止一个导出类型直接构造,必须通过new函数来构造? 其他的 oo 语言实现题主要求是非常简单的,只要定义相应的私有成员属性并通过构造函数控制输入的参数即可。...只是我们把 oo 语言中的构造函数换成了 Go 中的工厂方法,私有变量变成了 Go 包级别的私有成员属性。我们只需要通过定义指定的可导出的工厂方法创建实例即可。

    54920

    也说说不知道的Golang中参数传递

    在golang中存在着map、channel和slice这三种内建数据类型,它们极大的方便着我们的日常coding。然而,当这三种数据结构作为参数传递的时的行为是如何呢?...本文接下来的内容,将对golang中的map、channel和slice三种内建数据结构在作为函数参数传递时的行为进行分析,从而完整的解析golang中函数传递的行为。...上面是golang中的make()函数在map中通过makemap()函数来实现的代码段,可以看到,与我们猜测一致的是:makemap()返回的是一个hmap类型的指针*hmap。...因此,在golang中,当map作为形参时,虽然是值传递,但是由于make()返回的是一个指针类型,所以我们可以在函数哪修改map的数值并影响到函数外。...在介绍完map类型作为参数传递时的行为后,我们再来看看golang的特殊类型:channel的行为。

    1.8K91

    Golang 25个保留关键字

    下划线即空白标识符,表示不使用包中的标识符,只需要包的副作用,即计算包级变量的初始化表达式和执行导入包的init初始化函数。点号代替包的别名, 表示访问包中的导出标识符无需使用包名。...信道提供一种机制使两个并发执行的函数实现同步,并通过传递具体元素类型的值来通信。未初始化的信道值为 nil。...若没有给定方向,那么该信道就是双向的。信道可通过类型转换或赋值被强制为只发送或只接收。 信道的初始化可以通过 make 函数来实现,其结果值充当了对底层数据结构的引用。...( name = value name T = value ) 注意,Golang 中的 const 不支持像 C/C++ 中修饰函数的参数和返回值,即下面的语句是非法的。...映射属容器类类型,是一个同种类型元素的无序组,通过唯一的键可以获取对应的值。可以使用 make 创建 map 变量,未初始化的映射值为 nil。

    3.4K10

    golang模板渲染可控的条件下可以做什么?

    昨天ByteCTF逼我翻了一天的npm手册,一天速成nodejs,,, 今天美团决赛逼我一天速成golang,真的麻了 渲染语法内容学习参考 今天主要看了golang模板渲染的内容(使用的是text/template...return...; } TemplateType就是我们执行Execute的时候传入的模板对象的类型 而函数中的t在执行代码的时候就是我们在Execute传入的模板类型的变量 之后说一下可以在里面有哪些操作空间...: 在函数模板中.就代表传入的变量 在模板中产生一个新变量的方法有两个: {{$temp := true}} {{$temp = true}} 第一种方式是用于定义变量, 第二种则是用于变量赋值 个人认为最重要的一点...可以通过调用自定义的模板函数来对模板变量(姑且这么称呼吧,也就是执行Execute函数的时候传入的模板类型变量)进行修改, 或者通过自定义的函数来生成新的复杂数据 需要注意, 上面说明中自定义很关键,...想要说的基本说完了, 就是只能使用模板变量中的数据和模板变量所属类型定义的相关模板函数, 可以说先是是非常大了,如果模板变量里面只有一些int,bool,string类型的数据, 并且还没有任何的自定义模板函数的话即使给我们一个能够任意模板渲染的点

    64350

    Golang error 的突围

    New 函数创建出来的 error 类型实际上是 errors 包里未导出的 errorString 类型,它包含唯一的一个字段 s,并且实现了唯一的方法:Error()string。...,它先将字符串格式化,再调用 errors.New 函数来创建错误。...至少,不要把 Errortypes 作为一个导出类型。 最后一种, Opaqueerrors。翻译一下,就是“黑盒 errors”,因为你能知道错误发生了,但是不能看到它内部到底是什么。...这就是处理 Opaqueerrors 这种类型错误的策略。 当然,在某些情况下,这样做并不够用。例如,在一个网络请求中,需要调用者判断返回的错误类型,以此来决定是否重试。...至于是使用 error 还是 panic,看具体的业务场景。 当然,Go 中的 error 过于简单,以至于无法记录太多的上下文信息,对于错误包裹也没有比较好的办法。当然,这些可以通过第三方库来解决。

    99210

    你真的知道 GO 中 nil 代表什么吗?

    本篇文章主要是来聊聊 Golang 中关于 nil 的使用方式及理解,看看有没有你还不知道的情况呢?...使用 Golang 的朋友都知道,在 Golang 的世界里面,有一个预先声明的标识符 nil nil 标识符可以作为多种数据结构的零值,通常我们会将 nil 就认为是空的意思,就像 C 语言里面的 NULL.../false 一样,不是 Golang 的关键字 nil 和 一般我们知道的布尔类型的值(true/false)类似,都不是 Golang 的关键字 我们可以将 nil,true,或者 false 作为变量的名字...中的关键字,我们就没有办法将 const 作为变量名 nil 占用的空间因不同的数据结构而不同 在 C 语言中,我们知道可以通过 sizeof 去查看指针占用的空间,可能是 4 字节,也有可能是...,特别是对于新手使用指针,更要万分小心 但是一旦你熟悉了指针,你会爱上他的,由于 Golang 函数传参都是值传递 因此,我们一般开发的时候,会使用传指针的方式,虽然传递指针也是指针的拷贝,可是这样的资源开销会小很多

    52630

    go语言:函数参数传递详解

    1、常规传递 使用普通变量作为函数参数的时候,在传递参数时只是对变量值得拷贝,即将实参的值复制给变参,当函数对变参进行处理时,并不会影响原来实参的值。...2、指针传递 函数的变量不仅可以使用普通变量,还可以使用指针变量,使用指针变量作为函数的参数时,在进行参数传递时将是一个地址看呗,即将实参的内存地址复制给变参,这时对变参的修改也将会影响到实参的值...4、数组名作为函数参数 和其他语言不同的是,go语言在将数组名作为函数参数的时候,参数传递即是对数组的复制。在形参中对数组元素的修改都不会影响到数组元素原来的值。...在go语言中,函数也作为一种数据类型,所以函数也可以作为函数的参数来使用。...sum作为函数function的形参,而变量f是一个函数类型,作为function()调用时的实参。

    90310

    类与对象(中(1))

    Init(2024, 8, 18); d1.Print(); return 0; } 对于Date类,可以通过Init公有方法来给特定对象初始化日期,但如果每次都手动进行添加,容错率就比较高了,那么我们有没有什么更好的办法来初始化日期呢...:声明了d3函数,该函数无参,返回一个日期类型的对象      // warning C4930: “Date d3(void)”: 未调用原型函数(是否是有意用变量定义的?)      ...+11中,内置类型成员变量在类中声明时可以给默认值。...特性 析构函数也是特殊的成员函数: 1. 析构函数名是在类名前加上字符 ~。 2. 无参数无返回值类型。 3. 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。...如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,比如 Date类;有资源申请时,一定要写,否则会造成资源泄漏,比如Stack类。

    7110

    Go 单测高级篇:Golang 单测原理深入理解

    Go 单测的一些基本使用就不讲了,关于 Go 单测的基本介绍和使用可以查看我的另外两篇入门文章:• 《Go 单测入门篇:Golang 单元测试基本使用》• 《Go 单测入门篇:单元测试类型和 Golang...• 补齐是指用桩来代替未实现的代码,例如,函数A调用了函数B,而函数B由其他程序员编写,且未实现,那么,可以用桩来代替函数B,使函数A能够运行并测试。补齐在并行开发中很常用。...虽然说我们在语言层面很难去替换运行中的函数体,但是代码最终都会转换成机器可以理解的汇编指令,因此,我们可以通过创建汇编指令来改写函数。...• gomonkey 不支持异包未导出函数的打桩、不支持同包未导出方法的打桩2-2、mocker(mock) 的模拟mocker:https://pkg.go.dev/github.com/travisjeffery...在测试用例中创建一个模拟的方法(函数),用于替换原有自己代码中的方法(函数)• stub 一般就是在运行时替换了外部依赖返回的结果,并且结果不能调整(成本很高、不容易维护)。

    1.6K20

    Go 语言为什么建议定义零值可用的结构体?

    如果未提供显式初始化,则会为变量或值指定默认值,此类变量或值的每个元素都设置为其类型的零值。 02 Golang 类型的零值 在 Go 语言中,原生类型都有默认值,即类型的零值。...在我们使用 sync.Mutex 时,无需预先显式初始化,即可直接使用。 但是,需要注意的是,sync.Mutex 类型的变量在被使用之后,不能被复制。...id,在未预先对其进行显式初始化的情况下,直接使用 append 函数为其追加数据,结果是可以正常执行,未触发引用 nil 变量的错误。...但是,切片类型作为零值可用的类型,也有其局限性,以上示例代码中,我们不能通过下标的方式操作切片的值。...Go 语言内存逃逸案例 Golang 语言的多种变量声明方式和使用场景 Golang 语言中的内置函数 make 和 new Golang 语言中的非类型安全指针 参考资料: https://go.dev

    69840

    转--Golang语言-- Web 编程

    ( deleted = iota checked invalid = 3 ) 4.3.4 go程序设计规则 大写字母开头的变量是可导出的,是公用变量 小写字母开头的变量是不可导出的...数组之间的赋值是值的赋值,即把一个数组作为参数传入函数逇时候,传入的其实是该数组的副本,而不是它的指针。...可用于初始化任何类型 make: 返回一个初始化的实例,而不是指针。 4.4 if else 在条件判断语句里允许声明一个变量,这个变量的作用于只能在该条件逻辑块内,其它地方就不起作用了。...//返回多个值 return value1, value2 } 5.2 定义变参函数 func myfunc(arg …int){} 5.3 传值与传指针 传指针使用多个函数能操作同一个对象 传指针比较轻量级...5.5 函数作为值、类型 type typeName func(input1 inputType1 [, input2 inputType2 [, ...])

    93260

    【精选】2022年全新GO工程师面试题

    Fprintf()是吧格式化字符串输出到文件中。 2、Golang 使用什么数据类型?...每个 Go 源文件都属于一个包,该包在文 件顶部使用以下命令声明: package 您可以使用以下方法导入和导出包以重用导出的函数或类型: import Golang 程序 同时使用数千个 g、Goroutine。 要创建 Goroutine,请 go 在函数声明之前添加关键字。...new 的作用是初始化一个纸箱类型的指针 new 函数是内建函数,函数定义: func new(Type) *Type 使用new函数来分配空间 传递给new函数的是一个类型,而不是一个值 返回值是指向这个新非配的地址的指针...与其他作为学术实验开始的语言不同,Go 代码的设计是务实的。每个功能 和语法决策都旨在让程序员的生活更轻松。 Golang 针对并发进行了优化,并且在规模上运行良好。

    82520

    转--Golang语言-- Web 编程

    ( deleted = iota checked invalid = 3 ) 4.3.4 go程序设计规则 大写字母开头的变量是可导出的,是公用变量 小写字母开头的变量是不可导出的...数组之间的赋值是值的赋值,即把一个数组作为参数传入函数逇时候,传入的其实是该数组的副本,而不是它的指针。...可用于初始化任何类型 make: 返回一个初始化的实例,而不是指针。 4.4 if else 在条件判断语句里允许声明一个变量,这个变量的作用于只能在该条件逻辑块内,其它地方就不起作用了。...//返回多个值 return value1, value2 } 5.2 定义变参函数 func myfunc(arg …int){} 5.3 传值与传指针 传指针使用多个函数能操作同一个对象 传指针比较轻量级...5.5 函数作为值、类型 type typeName func(input1 inputType1 [, input2 inputType2 [, ...])

    93480

    Java8 Lambda表达式与Stream API (一):Lambda表达式你要知道的Java8 匿名内部类、函数式接口、lambda表达式与Stream API都在这里

    并且只能创建一个实例,创建完成后这个匿名内部类就不能再使用,因此,匿名内部类不能是抽象类,由于匿名内部类没有类名所以也不能定义构造函数,但是可以在定义匿名内部类的时候调用父类的有参构造器也可以定义初始化块用于初始化父类的成员变量...,在创建匿名内部类的时候可以调用父类的有参构造函数,栗子如下: abstract class Programmer { protected String name; public...,因此在创建匿名内部类的时候需要显示调用该构造函数,这样就可以在匿名内部类内部使用父类定义的成员变量了,匿名内部类也可以使用外部变量,在Java8中上述栗子中的age会自动声明为final类型,这称为effectively...,代码简洁明了,那有没有再简介一点的办法呢?...第二个sort方法则直接引用了对象的实例方法,语法规则为类::实例方法,系统会自动将函数式接口实现的方法的所有参数中的第一个参数作为调用者,接下来的参数依次传入引用的方法中即自动进行s1.compareTo

    1K80

    从零开发区块链应用(八)--结构体初识

    var m1 Member//所有字段均为空值 另外也有使用字面量创建变量,这种使用方式,可以在大括号中为结构体的成员赋初始值,有两种赋初始值的方式: 按照顺序提供初始化值: var m2 = Member...,对于其他没有指定的字段,则使用该字段类型的零值作为初始化值。...此种方式需要注意顺序 p5 := Persion{"白骨精",300,"女","白骨洞"} fmt.Println(p5) } 四、结构体指针 结构体与数组一样,都是值传递,比如当把数组或结构体作为实参传给函数的形参时...指针结构体,即一个指向结构体的指针,声明结构体变量时,在结构体类型前加*号,便声明一个指向结构体的指针,如: 注意,指针类型为引用类型,声明结构体指针时,如果未初始化,则初始值为 nil,只有初始化后,...八、结构体方法 在 Go 语言中,将函数绑定到具体的类型中,则称该函数是该类型的方法,其定义的方式是在 func 与函数名称之间加上具体类型变量,这个类型变量称为方法接收器,如: 注意,并不是只有结构体才能绑定方法

    69410
    领券