goland 学习笔记

函数是值传递还是引用传递的问题
当值传递时,当一个变量当作参数传递的时候,会创建一个变量的副本,然后传递给函数或者方法,你可以看到这个副本的地址和变量的地址是不一样的。
当变量当做指针被传递的时候,一个新的指针被创建,它指向变量指向的同样的内存地址,所以你可以将这个指针看成原始变量指针的副本。当这样理解的时候,我们就可以理解成Go总是创建一个副本按值转递,只不过这个副本有时候是变量的副本,有时候是变量指针的副本。

如何选择
不想变量被修改。 如果你不想变量被函数和方法所修改,那么选择类型T。相反,如果 想修改原始的变量,则选择*T
如果变量是一个大的struct或者数组,则副本的创建相对会影响性能,这个时候考虑使用 T,只创建新的指针,这个区别是巨大的
(不针对函数参数,只针对本地变量/本地变量)对于函数作用域内的参数,如果定义成 T,Go编译器尽量将对象分配到栈上,而
T很可能会分配到对象上,这对垃圾回收会有影响

函数样式
golang中,struct的method的形式如下:
func (r ReceiverType) funcName(parameters) (results)
receiver表示调用该方法的对象类型,可以通过设置不同的receiver类型来实现多态。
另外当receiver为指针时,go可以通过指针直接访问实体的字段,而不需要转成实体,因此
函数中*b.Color=c和b.Color=c都是可以的。
可以运用这种形式进行多态

				type Worker struct {
					name string
					age int
					phone string
				}
				
				type Women struct {
					Worker
					company string
				}
				
				func (w *Worker)Setworker()  {
					fmt.Println(w.name,w.age,w.phone)
				}
				func (m *Women)Setworker()  {
					fmt.Println(m.Worker.name,m.Worker.phone,m.Worker.age,m.company)
				}
				
				func main()  {
					w:=Women{Worker{"坚强",23,"213122"},"min"}
					w.Setworker()
					k:=Worker{"第二次",23,"2131312"}
					k.Setworker()
				}		

终端返回:
坚强 213122 23 min
第二次 23 2131312

interface{} 接口类型
interface{} 类型,空接口,如果您编写一个函数以 interface{} 值作为参数,那么您可以为该函数提供任何值。

				func DoSomething(v interface{}) {
					   // ...
					}

v 的类型是什么?新手们会认为 v 是任意类型的,但这是错误的。v 不是任意类型,它是 interface{} 类型。对的,没错!当将值传递给DoSomething 函数时,Go 运行时将执行类型转换(如果需要),并将值转换为 interface{} 类型的值。所有值在运行时只有一个类型,而 v 的一个静态类型是 interface{} 。

type起别名
type MyString string 则MyString 就相当于string

 name MyString  //name就是string类型

接口类型
在 go 中实现接口很简单,不需要显式的声明实现了某个接口,想要实现某个接口,只需要实现接口中的所有方法即可。

数组
Go语言数组声明需要指定元素类型及元素个数,语法格式如下:
// 变量名 [大小]类型
var variable_name [len]variable_type
遍历数组,大部分时候,我们都是使用for rang循环:

	for i, v := range arr {
	    fmt.Println("索引是:", i, "值是:", v)
	}

注意 数组的指针和指针数组是两个概念,数组的指针是*[5]int,指针数组是[5]*int

map用法
map[KeyType]ValueType
定义一个map变量:var m map[string]int
初始化方法1: m= make(map[int]string)
方法2: var m map[int]string=map[int]string{2:“你好”,4:“嗨咯”}
或者初始化一个空Map: m=map[int]string{}
读取 i:=map[2]
遍历

	for key, value := range m {
    fmt.Println("Key:", key, "Value:", value)
	}		

修改

	var s map[int]string= map[int]string{1:"s",2:"e",3:"t"}
	s[1]="o"

删除

	delete(s,2)	
发布了39 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42123182/article/details/89377257