Enjoy your life

AEnjoy’s Blog

golang小技巧:返回值简写,func (c *Struct)FunName与func (c Struct)FunName区别

本文介绍golang中的返回值有一个语法糖,可以帮助我们减少代码量;

1
func loadConfigYaml(f string) (defaultConfig yamlConfig)

同时还介绍func (c *Struct)FunName与func (c Struct)FunName区别

golang返回值变量:

golang可以将欲返回的变量值写在函数末尾,并作为一个作用域为函数体内的变量

例如:

1
2
3
4
5
6
7
8
9
10
11
func loadConfigYaml(f string) (defaultConfig yamlConfig) {
file, err := os.Open(f)
if err != nil {
fmt.Println("Error opening file:", err)
return yamlConfig{}
}
defer file.Close()
decoder := yaml.NewDecoder(file)
err = decoder.Decode(&defaultConfig)
return
}

此时,我们在函数的末尾使用return时可以不带变量名(返回的值).

这是常规写法,也是大多数编程语言的思维 :定义一个返回内容的变量,赋值后返回

1
2
3
4
5
6
7
8
9
10
11
12
func loadConfigYaml(f string) yamlConfig {
var defaultConfig yamlConfig
file, err := os.Open(f)
if err != nil {
fmt.Println("Error opening file:", err)
return yamlConfig{}
}
defer file.Close()
decoder := yaml.NewDecoder(file)
err = decoder.Decode(&defaultConfig)
return defaultConfig
}

func 后接的括号里带*与不带*的区别

在golang中,func 后接一个括号代表是这个结构体(接口)的方法,类似于C++的 classA::func(string a);

即func (b className)func(a string)<==>classA::func(string a);

其中golang代码中的b指代这个结构体对象,类似于Python中的self,c++/java的this

带*表示传递这个对象中的一切通过指针传递,最常用的特性就是可以修改值;不带*表示使用值传递方式,如果要修改结构体中属性的值,则不会生效.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package main

type myStruct struct {
a string
}

func (s myStruct) setA1(a string) {
s.a = a
}
func (s myStruct) readA1() {
println(s.a)
}
func (s *myStruct) setA2(a string) {
s.a = a
}
func (s *myStruct) readA2() {
println(s.a)
}

func main() {
s := myStruct{}
s.a = "dddd"
s.setA1("hello")
s.readA1() //将不会输出 hello , 而是输出dddd
s.setA2("hello2")
s.readA2() //输出 hello2
s.readA1() //输出 hello2
}

执行代码:

1
2
3
4
$ go run main.go
dddd
hello2
hello2

在go中,并不推荐同时使用func (s myStruct) 与func (s *myStruct),这两种选其一即可.