go语言的风格是尽量使用短小的名字,和c/c++类似,对于局部变量尤其是这样,例如循环索引喜欢用i,而不theLoopIndex,想要快速学会一种语言就要熟悉他的风格。
这里要扯一点就是,个人认为对go语言风格影响最大的是c和python了,c就不多说了,python和go的有个理念是一样的,就是做一件事只有一个最简洁的方法,所以python要求强制缩进,go不仅要求强制缩进,而且还不能出现未使用的变量,未使用的包。
好坏就不评判了,我个人还是觉得挺舒服的,只是在没有ide支持的情况下,估计会写的比较痛苦吧。
go语言用var声明变量,const声明常量,如
package main
import "fmt"
const boilingF = 212.0
func main() {
var f = boilingF
var c = (f ‐ 32) * 5 / 9
fmt.Printf("boiling point = %g°F or %g°C\n", f, c)
}
go语言声明变量的格式为
var 变量名字 类型 = 表达式
//如
var s string
//类型也可以不写,因为go是隐式推导的(现在新的静态语言类型隐式推导似乎成为标配了)
和lua一样支持多赋值,以及函数多返回值
var b, f, s = true, 2.3, "four" // bool, float64, string
除了var以外,go还支持一种类似pascal的简短声明法 :=,目前没发现和var在语义上有什么区别,不过传统是简短变量声明被广泛用于大部分的局部变量的声明和初始化。var形式的声明语句往往是用于需要显式指定变量类型地方
freq := rand.Float64() * 3.0
t := 0.0
i, j := 0, 1
函数的多返回值,其实我是很喜欢这个东西的,写起来很简洁,不用各种变量拆装。其实只要学过汇编的就知道,多返回值和多参数是一个东西,没有什么特别难实现的,只是因为c语言开了一个单返回值的头,所以后来的语言基本上都是单返回值了,目前我知道的真正有多返回值的语言只有lua和go,以及一些通过语法糖实现多返回值的例如ruby,python,kotlin
//同时声明以及赋值
in, err := os.Open(infile)
out, err := os.Create(outfile)
Go语言的指针是阉割版的,不能做地址数值运算,而且因为go语言是有垃圾回收器的,所以这个指针用起来其实和java的引用没太大区别(所以很多人说go其实不是一个底层语言,如果想找一个替代c/c++的底层编程语言,我还是推荐rust,而不是go)
package main
import "fmt"
func main() {
x:=1
p:=&x
//p++ 这种在c/c++里合法的地址运算在go里面是非法的
fmt.Println(p)//输出p的地址
*p=2
fmt.Println(*p)//输出p的值
}
在go语言里返回局部变量的地址也是可以的,原因是go语言的变量地址并不是像c/c++一样默认分配在栈上,而是根据上下文自动判断的。(现在知道go有多不底层了吧,其实它和c/c++真的是差了老远)
var p = f()
func f() *int {
v := 1
//因为编译器识别到& 此时v分配在堆上
return &v
}
表达式new(T) 可以快速返回一个 *T指针
p := new(int) // *int类型的指针
fmt.Println(*p) // "0"
*p = 2 // 设置值为 2
fmt.Println(*p) // "2
如之前所说,编译器会自动选择在栈上还是在堆上分配局部变量的存储空间,而并
不是由用var还是new声明变量的方式决定的,一般来说,在编写go代码的时候,不用去考虑变量是分配在栈上还是分配在堆上这个问题。你要做的只是尽可能的在变量不用的时候,就释放他的引用,让垃圾收集器回收他。
var global *int
func f() {
var x int
x = 1//x在堆上分配,因为有&x语句
global = &x
}
func g() {
y := new(int)//即使有new,y还是在栈上分配,因为没有任何其他地方再引用到他了
*y = 1
}
和lua差不多的交叉赋值,只要支持多赋值多返回值的语言基本都能做到
x, y = y, x
a[i], a[j] = a[j], a[i]
计算斐波纳契数列(Fibonacci)的第N个数
func fib(n int) int {
x, y := 0, 1
for i := 0; i < n; i++ {
x, y = y, x+y
}
return x
}
欢迎关注我的github https://github.com/luckyCatMiao