Go基础学习【2】

简介: Go基础学习【2】

一:数组

1.命名

var arrAge = [5]int{1,2,3,4,5}

var arrAge =[…]int{1,2,4,5,6}

var arrAge =[5]string{3:“sfd”,5:“asdf”}


2.传递

通过传递数组的指针 和 使用数组的切片 来防止数组传递给函数消耗的内存


3.切片

切片的定义;
make([]int,50,50)
new([100]int)[0:50]


切片是一个可变的数组,在 Go 代码中 切片比数组更常用。不可以将指针只想切片,因为切片本身就是一个指针了,使用make创建切片切片拥有长度和容量。

切片的长度是它所包含的元素个数。

切片的容量是从它的第一个元素开始数,到其底层数组元素末尾的个数。

make([]int, len,cap)  //50表示长度,cap可写可不写  
new([100]int)[0:50]   //这两种方法表示IDE是一样的
var v [] int = make([]int,10,50) 等价于 v:make([]int,10,50)

第一种适用于 map 切片 和channel

第二种使用于 数组 结构体

切片依旧适用for range格式 来进行遍历

切片的复制和添加

添加的第一种方式:copy() copy(s1.s2) 将s2内容拷贝到s1中也可以作为添加来说

添加的第二种方式:append(s1,s2) 将s2添加到s1尾部


4、切片的应用

修改某个字符的时候,首先将其转化为byte类型,然后进行字符修改,然后在将其从字符转化为字符串

s := "hello"
c := []byte(s)
c[0] = 'c'
s2 := string(c) // s2 == "cello"


二:map集合

使用make来构造map,不要使用new,如果map中新增容量,那么容量会自动增加,但是还是提前标出容量为好

var map1 map[keytype]valuetype  //定义形式
var map1 map[string]int   //定义形式
赋值形式:一种是根据键定值
第二种形式如下:
noteFrequency := map[string]float32 {
    "C0": 16.35, "D0": 18.35, "E0": 20.60, "F0": 21.83,
    "G0": 24.50, "A0": 27.50, "B0": 30.87, "A4": 440}


map类型的切片:

定义:
make([]map[string]int])

使用两层make,第一层make是定义切片,第二层make是定义map里的元素

map的排序:将键或者值拷贝到一个切片,可以借助切片中的sort方法来进行排序,然后使用for-range输出


三:包

1.上锁

线程占用问题,多个不同线程访问同一个变量的时候有顺序问题,可以通过对变量的上锁和解锁来防止资源竞争

func Update(info *Info) {
    info.mu.Lock() //上锁
    info.Str = // new value //赋值
    info.mu.Unlock() //解锁
}

还可以通过RWMutex锁:RLock() 同一时间内允许多个线程同时访问,但是只有一个线程能够进行写操作


2.自定义包

创建新包并引入时 注意的是首字母大写的变量名和函数才属于共有的,其他都是私有的


四:结构体

格式定义

type identifier struct{
    field1 type1
    field2 type2
}
type T  struct{a , b int}
var t * T  //变量t是指向T的一个指针
t:=new(T) //给t分配内存,并零值化内存


结构体的匿名字段:定义结构体时。只定义了类型,没有定义字段名

普通结构体:
type hello struct{
    name sting
    a int
}


匿名结构体:

type hello struct{
    int 
    string
}


值类型的接收者和指针类型的接收者区别:

指针类型的接受者在改变之后,变量的值发生改变;而值类型的接收者在改变变量的值后,变量的值没有是不受影响的,只有go复制出来的副本受其影响

在需要改变值的时候或拷贝代价较大时候以及为了维持一致性,使用指针类型接收者
当嵌套字段名发生冲突的时候,为了避免冲突,需要具体到具体结构体和方法

user3.Address.CreateTime = "2000" //指定Address结构体中的CreateTime
user3.Email.CreateTime = "2000"   //指定Email结构体中的CreateTime


可以通过直接命名方式对结构体进行赋值:

d1 := &Dog{
   Feet: 4,
   Animal: &Animal{ //注意嵌套的是结构体指针
      name: "乐乐",
   },
}


相关文章
|
19天前
|
安全 Java 编译器
对比Java学习Go——基础理论篇
本章介绍了Java开发者学习Go语言的必要性。Go语言以简单、高效、并发为核心设计哲学,摒弃了传统的类继承和异常机制,采用组合、接口和多返回值错误处理,提升了代码清晰度与开发效率。Go直接编译为静态二进制文件,启动迅速、部署简便,其基于Goroutine和Channel的并发模型相较Java的线程与锁机制更轻量安全。此外,Go Modules简化了依赖管理,与Java的Maven/Gradle形成鲜明对比,提升了构建与部署效率。
|
9天前
|
存储 Java Go
对比Java学习Go——函数、集合和OOP
Go语言的函数支持声明与调用,具备多返回值、命名返回值等特性,结合`func`关键字与类型后置语法,使函数定义简洁直观。函数可作为一等公民传递、赋值或作为参数,支持匿名函数与闭包。Go通过组合与接口实现面向对象编程,结构体定义数据,方法定义行为,接口实现多态,体现了Go语言的简洁与高效设计。
|
19天前
|
存储 Java 编译器
对比Java学习Go——程序结构与变量
本节对比了Java与Go语言的基础结构,包括“Hello, World!”程序、代码组织方式、入口函数定义、基本数据类型及变量声明方式。Java强调严格的面向对象结构,所有代码需置于类中,入口方法需严格符合`public static void main(String[] args)`格式;而Go语言结构更简洁,使用包和函数组织代码,入口函数为`func main()`。两种语言在变量声明、常量定义、类型系统等方面也存在显著差异,体现了各自的设计哲学。
|
3月前
|
Go
学习 Go并发模型
本文通过一个简单例子,讲解如何将数组数据转换为其平方值,并将其分解为三个步骤:生产信息(`producer()`)、处理信息(`square()`)和消费信息(`main()`)。进一步介绍了 FAN-OUT 和 FAN-IN 模型的优化,展示了多 goroutine 并发读写通道的实现方式。FAN-OUT 是多个 goroutine 从同一通道读取数据,而 FAN-IN 是单个 goroutine 从多个通道读取数据。最后强调了优化 FAN 模式时需根据具体场景解决瓶颈问题,并推荐使用带缓冲的通道以提高性能。
学习 Go并发模型
|
程序员 Go 云计算
2023年学习Go语言是否值得?探索Go语言的魅力
2023年学习Go语言是否值得?探索Go语言的魅力
|
缓存 NoSQL Go
通过 SingleFlight 模式学习 Go 并发编程
通过 SingleFlight 模式学习 Go 并发编程
|
10月前
|
数据采集 监控 Java
go语言编程学习
【11月更文挑战第3天】
169 7
|
10月前
|
设计模式 测试技术 Go
学习Go语言
【10月更文挑战第25天】学习Go语言
150 4
|
JSON 中间件 Go
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
本文详细介绍了如何在Go项目中集成并配置Zap日志库。首先通过`go get -u go.uber.org/zap`命令安装Zap,接着展示了`Logger`与`Sugared Logger`两种日志记录器的基本用法。随后深入探讨了Zap的高级配置,包括如何将日志输出至文件、调整时间格式、记录调用者信息以及日志分割等。最后,文章演示了如何在gin框架中集成Zap,通过自定义中间件实现了日志记录和异常恢复功能。通过这些步骤,读者可以掌握Zap在实际项目中的应用与定制方法
558 1
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
|
编译器 Go
go语言学习记录(关于一些奇怪的疑问)有别于其他编程语言
本文探讨了Go语言中的常量概念,特别是特殊常量iota的使用方法及其自动递增特性。同时,文中还提到了在声明常量时,后续常量可沿用前一个值的特点,以及在遍历map时可能遇到的非顺序打印问题。