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

GO语言初始化数据结构的方法你知道吗?

xdm 我是阿兵云原生 使用 golang 进行编码过程中,你们都是如何初始化数据结构的呢 GO 里面提供了 2 个关键字来进行初始化数据结构 new make 不过有时候我也会直接使用花括号的方式直接就初始化...: 自定义一个结构体,里面 2 个成员, age 和 name 使用 new 对 T 最初始化,返回一个结构体的指针 type T struct{ age int name string } func...返回的是一个指针,且这个指针指向的内存地址上对应的值是一个该类型的 零值 瞅一眼 new 源码说明 image-20211017150756595 golang 源码中说到, new 的第一个参数是...数据类型,不是一个值,并且 new返回值是一个根据参数类型分配零值内存的指针 因此,我们上面看到的 new 出来的数据结构,打印出来的数据都是对应类型的零值 make 和 new 的区别 最后再来梳理一下...make 和 new 的区别,加深印象 make 只能用来初始化内置数据类型 slice map chan new 可以分配任意类型的数据(包括自定义数据类型) make 返回的是引用,是 Type

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

golang | Go语言入门教程——结构体初始化与继承

今天是golang专题第10篇文章,我们继续来看golang当中的面向对象部分。 在上一篇文章当中我们一起学习了怎么创建一个结构体,以及怎么给结构体定义函数,还有函数接收者的使用。...new关键字 我们可以通过new关键字来创建一个结构体的实例,这种方法和其他语言比较类似,这样会得到一个空结构指针,当中所有的字段全部填充它类型对应的零值。...,new函数返回的是一个结构指针不是结构体的值。...一般我们很少用new关键字,而是直接通过结构体加花括号的方式来初始化。 结构体名称 相比于使用new关键字,我们更常用的是通过结构体名称加上花括号的方式来进行初始化。...所以创建一个结构指针可以这样: func main() { p := &Point{} fmt.Print(p) } golang当中取地址符和声明指针的关键字和C语言是一样的,对于熟悉C语言的同学来说

1.3K20

世界上最好的语言——Go

字符串的字符可以直接使用索引获取,如 var s string = "abc" println(s[0])//字符a 使用len内置函数获取字符串长度 len(s) 字符串可以直接使用+拼接,返回一个新字符串...var a int = 1 var p * int = &a 与c++不同,golang中的结构指针和普通结构体变量,都是通过.运算符获得成员,所以指针变量使用起来与普通变量差别看起来不是很大,只是因为其代表的是指针的变量...比如 //创建一个长度为5的int slice var a []int = make([]int ,5,10) //与数组不同的是slice变量在赋值(函数传参等)时是引用赋值,不是复制 其中第三个参数是...,复制旧元素,即返回不是之前的地址,但是go会自动修改前面旧slice引用的地址为新地址,所以对旧slice使用不会有影响(旧变量也会引用到新地址) map golang中定义一个map格式为 var...,返回创建后的文件指针 TempDir 创建指定前缀名的临时目录,返回创建目录的路径 WriteFile 将字节slice写入文件 ReadFile 读一个文件,返回文件内容(字节slice) ReadDir

84241

Golang其他细节总结

new 和 make 区别 参考博客作用变量类型不同:new 给 string, int, array 分配内存,make 给 slice, map, channel 分配内存;返回类型不一样:new返回指向变量的指针...,make返回变量本身;处理方式不同:new 分配的空间被置零。...,切片是引用类型(切片底层指向一个数组)Golang指针传递的优点通过引用类型来传递大的数据结构,可以避免数据结构被复制多次,减少内存的消耗和运行时间的开销。...当本线程无可运行的G时,尝试从其他线程绑定的P偷取G,不是销毁线程 系统调用 hand off 机制:G进行系统调用阻塞时,线程释放绑定的 P,把 P 转移给其他空闲的线程执行设置P的数量,提高并行能力抢占式调度...golang pprof实用使用指南(使用 pprof 做性能调试)传参数组过大,导致内存占用过大切片截取引起子切片内存泄漏(解决:make 一个新的切片,把数据 copy 过来)Goroutine 阻塞无法退出

23521

Golang 语言中的非类型安全指针

01 介绍 Golang 语言中的 unsafe 包中包含的操作会绕过 Golang 程序的类型安全检查,直接操作内存,从而达到提升性能的目的。...student := new(user) // user 结构体中的 name 字段是第一个字段,可以直接通过指针修改,不需要使用偏移 studentName := (*string)(unsafe.Pointer...(student)) *studentName = "lucy" // user 结构体中的 age 字段不是第一个字段,所以需要使用偏移才能找到 age 字段的内存地址,修改值 studentAge...new 函数定义了一个 *user 类型的指针变量 student,然后使用 unsafe.Pointer 将 *user 类型的指针变量 student 转换为 *string 类型的指针变量 studentName...因为 age 字段不是 user 结构体的第一个字段,所以需要先使用偏移量找到 age 字段的内存地址,具体操作步骤是:先将 student 指针变量通过 unsafe.Pointer 和 uintptr

86220

Go 问答汇总篇 二

golang 中时候用指针什么时候用普通对象? 其实就两点,一是如果数据结构比较大,建议采用指针,不会发生值拷贝。二是如果需要修改结构的话,必须用指针。...Golang中的make(T, args)为什么返回T不是*T? make 针对的是 Go 的引用类型,即 chan、slice 和 map, new 针对的指针。...引用类型为什么 make 不是返回指针呢?这样一说好像和上个问题有点类似了,当然因为引用并不存在值类型的那些问题。...golang 等值比较是不是直接比较地址呢? 首先要说 Go 的等值比较比较的是值,不是地址。...Golang中fmt.Println和直接println有什么区别? println 主要是 Go 自己使用,比如源码、标准库等, fmt 才是给 Go 开发人员使用的。

52020

Golang面试题集锦

数组大小是固定的,切片大小不是。在运行时可以动态地增加或减少切片的大小,但数组不可以。切片类似于链表,可以向切片push,pop数据,实现FIFO,LIFO。使用了内置的添加、复制功能对切片操作。...1、new 的作用是初始化一个指向类型的指针(*T) new函数是内建函数,函数定义:func new(Type) *Type 使用new函数来分配空间。传递给new 函数的是一个类型,不是一个值。...它仅仅用于创建 Slice, Map 和 Channel,并且返回类型是 T(不是*T)的一个初始化的(不是零值)的实例。 简单介绍下golang中make和new的区别?...new(T)是为一个T类型的新值分配空间,并将此空间初始化为T的零值,并返回这块内存空间的地址,也就是T类型的指针T,该指针指向T类型值占用的那块内存。...make(T,args)返回初始化之后T类型的值,且此新值并不是T类型的零值,也不是T类型的指针T,而是T类型值经过初始化之后的引用。

2.1K20

数据类型和表达式

以下是一些关于Golang复合数据结构体(Struct)类型的一些例子 以下是一些使用 Golang 结构体的例子: package main import "fmt" // 定义一个表示人的结构体...需要注意的是,在 Golang 中相等和不等运算符是 == 和 != 不是 = 和 。 接下来我们展示了逻辑运算符的优先级,包括 && 和 ||。...x := 42 p1 = &x fmt.Println(*p1) // 输出:42 // 使用 new 函数创建指针对象 p2 := new(int) *p2...我们通过 & 运算符获取变量 x 的地址,并将其赋值给指针变量 p1。然后我们使用 * 运算符访问指针所指向的变量的值,并打印出来。 接着我们演示了如何使用 new 函数创建指针对象。...我们使用 new 函数创建了一个新的整数类型变量,并将其地址赋值给指针变量 p2。然后我们使用 * 运算符访问指针所指向的变量的值,并打印出来。 最后,我们演示了如何在函数中使用指针参数。

12810

Java与Go到底差别在哪,谁要被时代抛弃?

函数可以脱离“类”存在,函数可以依赖于结构体来调用或者依赖于包名调用。Golang 中的结构体放弃了继承、实现等多态概念,结构体之间可使用组合来达到复用方法或者字段的效果。...() {   personPoint := new(User) // 通过new方法创建结构指针   person1 := User{} // 通过Person{}创建默认字段的结构体   person2...new方法创建结构指针   entity.Solve(userPoint) // 函数调用   userPoint.Solve() // 方法调用 } 1.5 值类型、引用类型以及指针 Java...Golang Golang 中存在显式的指针操作,但是 Golang指针不像C那么复杂,不能进行指针运算。...除赋值以外它们都可以当做引用类型来使用。因此当我们这样做时,可以直接使用变量本身不用指针。 slice 与数组的区别为是否有固定长度,slice无固定长度,数组有固定长度。

52790

Golang与Java全方位对比总结

函数可以脱离“类”存在,函数可以依赖于结构体来调用或者依赖于包名调用。Golang中的结构体放弃了继承、实现等多态概念,结构体之间可使用组合来达到复用方法或者字段的效果。...() { personPoint := new(User) // 通过new方法创建结构指针 person1 := User{} // 通过Person{}创建默认字段的结构体 person2...GolangGolang中存在显式的指针操作,但是Golang指针不像C那么复杂,不能进行指针运算;所有的基本类型都属于值类型,但是有几个类型比较特殊,表现出引用类型的特征,分别是slice、map...、channel、interface,除赋值以外它们都可以当做引用类型来使用,因此当我们这样做时,可以直接使用变量本身不用指针。...所有可能出现异常的方法或者代码直接把错误当作第二个响应值进行返回,程序中对返回值进行判断,非空则进行处理并且立即中断程序的执行。

1K71

Go 语言入门系列:指针的基本应用

Golang 中具备丰富的数据类型,基本类型有整型、浮点数、布尔型、字符串型等,除此之外,还有切片、结构体、指针、通道、map、数组等其他类型。本文将会介绍 GO 语言中的指针基本概念与相关用法。...除了使用 & 对变量进行取址操作创建指针,还可以使用 new 函数直接分配内存,并返回指向内存的指针,此时内存中的值会被初始化为类型的默认值。...如下例子所示: str := new(string) *str = "Golang is Good!" 在上述代码中,通过 new 函数创建了一个 *string 指针,并通过指针对其进行赋值。...在 Golang 的 flag 包中,命令行参数一般以指针返回,下面我们演示一个读取命令行参数的例子,如下代码所示: package main import ( "flag" "fmt" )...flag.Parse() fmt.Printf("I am %v %v, and my id is %v\n", *surname, personalName, *id) } 在上述代码中可以看到,除了直接获取指针类型的返回结果

53840

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

本文将从这三个内建结构展开,来介绍golang中参数传递的一些细节问题。 背景 首先,我们直接的来看一个简短的示例,下面几段代码的输出是什么呢?...当然不是,请再请看看下面的例子:当我们使用的参数不再是string,改为map类型传入时,输出结果又是什么呢?...我们发现,与map和channel不同的是,sclie的make函数返回的是一个内建结构体类型slice的对象,并非一个指针类型,其中内建slice的数据结构如下: type slice struct...: makeslice()出来的一定是个结构体对象,不是指针; 函数内外打印的slice地址一致; 函数体内对slice中元素的修改在函数外部生效了; 函数体内对slice进行append操作在外部没有生效...但是,这些修改得以实现的原因,是因为数据本身是个指针类型,不是因为golang采用了引用传递,注意二者的区别哦~

1.8K91

Golang指针与nil浅析

Golang也提供了指针,但是go不能进行指针运算,因此相对于C也少了很多复杂度。私以为,go之所以提供指针,并不是为了让你更多和内存打交道,而是提供操作数据的基本桥梁。...我们已经了解,nil的值是不能直接赋值的,因此(*arrPot)[0] = 11直接赋值会抛错。 new 关键之函数 既然如此,我们可以使用new创建一块内存,并把内存地址给arrPot指针变量。...go会给引用类型初始化为nil,nil是不能直接赋值的。并且,map和数组指针还不一样,不能使用new开辟一个内存,然后再赋值。...new返回的是内存的地址,make则返回时类型的示例。比如new一个数组,则返回一个数组的内存地址,make一个数组,则返回一个初始化的数组。...方法中的指针 Go可以让我自定义类型,类型又可以创建方法。与OOP类似,方法接受一个类型的实例对象,称之为接受者,接受者既可以是类型的实例变量,也可以是类型的实例指针变量。

1.1K60

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

01 介绍 在 Go 语言中,通过声明或者通过调用 new 为变量分配存储空间,或者通过复合字面量或调用 make 创建新值时。...03 Golang 定义零值可用的结构体 在 Go 语言中,定义零值可用的结构体不仅对程序的安全性和正确性非常重要,它还可以无需预先显式初始化即可直接使用,使 Go 程序代码更优雅。...在我们使用 sync.Mutex 时,无需预先显式初始化,即可直接使用。 但是,需要注意的是,sync.Mutex 类型的变量在被使用之后,不能被复制。...但是 Golang 的切片类型比较特殊,它是零值可用的类型,我们可以直接对其进行 append 操作,不会触发引用 nil 的错误。...Go 语言内存逃逸案例 Golang 语言的多种变量声明方式和使用场景 Golang 语言中的内置函数 make 和 new Golang 语言中的非类型安全指针 参考资料: https://go.dev

61440
领券