本文介绍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() s.setA2("hello2") s.readA2() s.readA1() }
|
执行代码:
1 2 3 4
| $ go run main.go dddd hello2 hello2
|
在go中,并不推荐同时使用func (s myStruct) 与func (s *myStruct),这两种选其一即可.