Golang初入编程-踩坑笔记(1)

2023-11-15

  1. 一定要自己动手写,不然使用的时候可能连等号的位置都搞不清楚

  2. 该语言没有面向对象的概念,什么函数传什么参数返回什么值自己要多练习

  3. i++属于独立语句,不能和其他语句写到一起,自己占一行

  4. 以下东东需要初始化(开辟空间),包括切片,指针,map(数组声明后,会填充默认值)

  5. 函数可返回多个

  6. 使用:=声明并赋值,函数外不行

  7. const常量(静态变量)关键字,内部可使用iota作为计数器赋值

  8. iota只能在常量的表达式中使用

  9. 每次const出现都会使iota归零

  10. iota按行自增,所以同一行的iota是一样的值

  11. 可以使用 _ 来接收不要的参数,可以用来跳过iota的值,或者接收函数的返回值时用来占位

  12. 切片是引用类型,底层数组改变,切片也会变

  13. append()只有两个参数,第一个是被加的切片,第二个是追加的切片,(返回的也是切片),其实就是俩切片相加

  14. append()第二个参数要加 ... 才是每个值,这是单个添加的特殊写法

  15. 用于切片的append函数(追加)需要接收,注意:根据需求,该函数会改变底层数组

    testSlice = append(testSlice, 0)
    
  16. 指针开辟空间要用new关键字,其他数组,mapchan都需要用makemake内部不传入什么实例,没有实例的概念,要传入类型,容量,长度等)

  17. 但是一般不用new([]int)来搞指针,为啥要自己建一个空指针呢?空指针会直接报错!应该使用取地址来操作

    pointer = &a
    
  18. for k,v := range myArray{}注意:=位置

  19. copy(切片|数组,切片)被复制的只能是切片,输出文档上说是切片,可是我实测数组也行,可能是引用类型的原因。

  20. copy输出的也是切片!返回的是长度

func main() {
	slice1 := []int{1, 2, 3, 4, 5}
	slice2 := []int{5, 4, 3}
	copy(slice2, slice1) // 只会复制slice1的前3个元素到slice2中
	fmt.Println(slice1)//[1 2 3 4 5]
	fmt.Println(slice2)//[1 2 3]
	slice1 = []int{1, 2, 3, 4, 5}
	slice2 = []int{5, 4, 3}
	lenth := copy(slice1, slice2) // 只会复制slice2的3个元素到slice1的前3个位置
	fmt.Println(slice1)//[5 4 3 4 5]
	fmt.Println(slice2)//[5 4 3]
	fmt.Println(lenth)//3
}
  1. 集合直接make也行,反正都要初始化
  2. 函数作为接收者,尽量用指针
  3. 同理,参数也尽量用指针
  4. 函数调用会复制参数,所以不使用指针不能改变结构体(对象)的值
  5. 对象/结构体调用函数时,不用管指针还是取地址*s,&s,反正go都会自动转换,关键是函数要把接收者写成指针形式。
  6. 注意go对象自动转换不能套环,嵌套无效,案例如下
type Student struct {
   age int8
   name string
}
type StudentPoint *Student
 
func (Student) sayHello() {  //省略receiver 的参数参数名字
   fmt.Println("hello world")
}
 
func (s Student) showName() { 
   fmt.Println(s.name)
}
 
func (s * Student) setName(newName string) {
   s.name = newName
}
// Error:接受者(receiver)为指针类型
func (s StudentPoint) showName2(){ // Error:接受者(receiver)为指针类型
   fmt.Println(s.name)
}
 
s := Student{}
s.setName("dq") 
//go会自动转为 (&s).setName("dq")
 
var s2 = &s
s2.showName() 
//o会自动转为 (*s2).showName()
  1. 在结构体中嵌入指针变量,要注意赋值,不然新建一个带有指针的对象,内部指针未赋值,会panic,空指针报错。初始化结构体,并不会给一个指针开空间。
type Person struct {
   age  int8
   name string
}
func (s Person) showName() {
   fmt.Println(s.name)
}
func (s *Person) setName(newName string) {
   s.name = newName
}
type Student1 struct {
   Person //Student1包含了Person,那么Student1对应的value和pointer包含Person
}
type Student2 struct {
   *Person
} 
// 内嵌类型 Persion默认值为 Person{age:0, name:""}
s1 := Student1{}
s1.setName("student1_01") // ok
s1.showName()
// 内嵌类型 *Persion默认值为 nil
s2 := &Student2{}
s2.setName("student1_02") //Error,由于目前内嵌类型的值为nil,会触发报错
s2.showName()
// 给嵌入类型一个复制,就ok了
s3 := &Student2{Person:&Person{age:3, name:"s3"}}
//s3 := &Student2{&Person{age:3, name:"s3"}} 和上一行等价
s3.showName()
  1. for i, v := range arri,v都是复制的,并且只有一个,所以直接取地址,或者希望改变i,v来改变源数组,都是不行的。直接取地址保存的是复制的v的地址,其内容就只是循环结束后的内容,每次循环内容都会被改变,指针不变。
func main() {
	arr := []int{1, 2, 3}
	myMap := make(map[int]*int)
	for i, v := range arr {
		myMap[i] = &v	//错了,v的地址永远不变
	}
	for _, v := range myMap {
		fmt.Println(*v) 	//输出3,3,3
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Golang初入编程-踩坑笔记(1) 的相关文章

  • 设计模式(Design Patterns)

    原文地址 http blog csdn net zhangerqing article details 8194653 设计模式 Design Patterns 可复用面向对象软件的基础 设计模式 Design pattern 是一套被反复

随机推荐

  • 机器学习算法+代码

    机器学习 一 概述 1 机器学习研究方向 传统预测 图像识别 自然语言处理 2 数据集构成 数据集 特征值 目标值 监督学习 目标值为类别 属于分类问题 目标值为连续数据 属于回归问题 无监督学习 无目标值 3 机器学习流程 获取数据 数据
  • Python,OpenCV骨架化图像并显示(skeletonize)

    Python OpenCV骨架化图像并显示 skeletonize 1 效果图 2 源码 参考 1 效果图 自己画一张图 原图 VS 骨架效果图如下 opencv logo原图 VS 骨架化效果图如下 2 源码 图像骨架化
  • 统一登录门户系统

    随着等保2 0和密评工作的深入推进 各政企单位的应用系统建设会向着更安全 更标准方向发展 为了推进整合信息共享 破除各系统之间的壁垒 首先要建设的就是统一登录门户系统 常见的统一登录要求 还是基于一个统一的入口 由统一登录入口完成登录后 可
  • kafka java 性能测试_针对kafka_2.13版本测试过程中的一些坑

    声明 这是在windows10上进行kafka 2 13demo搭建时的过程记录 提供给同学们参考 1 jdk先要装一下 自己安装的kafka最好检查一下配置文件中的参数 server properties 1 zookeeper conn
  • Java Pattern.matcher()方法具有什么功能呢?

    转自 Java Pattern matcher 方法具有什么功能呢 下文笔者讲述Pattern matcher 方法的功能简介说明 如下所示 Pattern matcher 方法的功能 用于匹配字符串或返回Matcher实例 Pattern
  • VM安装mac问题

    安装VM以及mac虚拟机 http tieba baidu com p 2847457021 遇见问题 您的 mac os 客户机正在使用cd dvd 此操作无法继续 请忽略此消息 并从客户机内弹 首先 需要下载安装darwin6 iso才
  • 自动化测试岗位建议熟读!!!Python+Selenium代码编写方法大全

    整理过的自动化测试selenium工具代码常用方法大全 对于常使用selenium工具的朋友一定经常会使用 建议熟读熟练 当然收藏之后复制粘贴也可以 这些整理过的web自动化测试进阶资料 有需要的可以进入群聊免费领取点击并输入暗号 CSDN
  • ganymed-ssh2实现java ssh协议采集

    我的博客第一篇讲的就是用Maverick组件实现java ssh协议采集 可惜Maverick是个商业软件 不开放源码且只有45天的试用期 实际上在网上也能搜到不少实现java ssh的开源组件 例如orion ssh2 trilead s
  • Vue路由组件独有的两个生命周期钩子

    1 作用 用于捕获路由组件的激活状态 2 具体名字 2 1 activated路由组件被激活是触发 activated this timer setInterval gt console log this opacity 0 01 if t
  • Elastic Search:(一)快速入门

    目录 1 快速入门 1 1 核心概念介绍 1 2 RESTful风格介绍 1 2 1 概念 1 2 2 方法 1 3 索引 1 3 1 新增索引 PUT 1 3 2 获取索引 GET 1 3 3 删除索引 DELETE 1 3 4 判断索引
  • 以AI对抗AI,大模型安全的“进化论”

    点击关注 文丨刘雨琦 编 王一粟 互联网时代 我们是更危险 还是更安全 2016年 互联网正值高速发展之际 电梯广告经常出现这几个大字 两行标语 从病毒木马到网络诈骗 对于安全的思考 安全防范技术的建立一直在与科技发展赛跑 同样 大模型时代
  • paypal中授权返回_2020最新教程:如何在Unity Ads中填写W-8BEN(W8税表)

    税收资料作为payout profile的一部分 是必须要填写的 即使你不是美国居民 也需要填写个人资料的 纳税 部分 否则将无法获得来自于Unity的付款 由于我们不是美国居民 因此只需要填写W 8BEN即可 其实 它的填写方法与我之前写
  • 计算机中1kb等于多少字节,在计算机中1kb等于多少字节

    在计算机中1kb等于1024个字节 字节是计算机信息技术用于计量存储容量的一种计量单位 也表示一些计算机编程语言中的数据类型和语言字符 一个字节存储8位无符号数 本文操作环境 windows10系统 thinkpad t480电脑 学习视频
  • QEMU-在内核中增加驱动(6)

    上面是我的微信和QQ群 欢迎新朋友的加入 进入linux源码目录 增加驱动 hello c include
  • Java面试----2018最全Redis面试题整理

    1 什么是Redis 答 Redis全称为 Remote Dictionary Server 远程数据服务 是一个基于内存的高性能key value数据库 2 Redis的数据类型 答 Redis支持五种数据类型 string 字符串 ha
  • python 访问网络失败 huggingface ConnectionError

    使用Hugginface下载数据集 dataset load dataset path seamew ChnSentiCorp 结果遇到网络问题 huggingface ConnectionError Couldn t reach 原因是无
  • element中同一个一面使用两个table,使用v-if判断显示,数据混乱

    错误 在一个页面中使用两个table 绑定不同的数据 并且在table中row中使用
  • 梯度下降法求解线性回归--Numpy实现

    梯度下降法求解一元线性回归 依然是这个房价预测的任务 这是一个一元线性回归问题 这次我们采用梯度下降法来求解它可以分为5步 第1步加载样本数据x y 第2步设置超参数 在这个例子中 超参数包括学习率和迭代次数 第3步设置模型参数的初值 w
  • 巧用搜索摆脱新手程序员标签

    文章目录 巧用搜索摆脱新手程序员标签 在哪里搜 搜索什么 搜教程 搜IDE 搜特性 搜集成 搜比较 搜定义 搜原因 搜架构 搜错误 扩展阅读 巧用搜索摆脱新手程序员标签 在哪里搜 国外网站 Google 搜索引擎 Bing 搜索引擎 Git
  • Golang初入编程-踩坑笔记(1)

    一定要自己动手写 不然使用的时候可能连等号的位置都搞不清楚 该语言没有面向对象的概念 什么函数传什么参数返回什么值自己要多练习 i 属于独立语句 不能和其他语句写到一起 自己占一行 以下东东需要初始化 开辟空间 包括切片 指针 map 数组