命名
Golang中的关键字有25个,关键字不能用于自定义名字,只能在特定语法结构中使用
在习惯上要优先使用驼峰命名
声明
golang提供了四种类型的声明语句:var const type func
变量
- 普通变量声明法:
var 变量名 类型 = 表达式
//声明单个变量
var s string = "hello"
fmt.Print(s) // hello
//声明多个变量
var i,j,k int = 1,2,3
fmt.Println(i,j,k) // 1 2 3
//类型自动推导式声明
var a,b,c = true,"hh",0.01
fmt.Println(a,b,c) //true hh 0.01
fmt.Printf("%T %T %T",a,b,c) // bool string float64
- 懒汉声明法
变量名 := 表达式
a,b,c := 1,true,"hhh"
fmt.Println(a,b,c)
fmt.Printf("%T %T %T",a,b,c) // bool string float64
赋值
这个语言有个特色,比如说元素交换可写成
x,y = y,x
a[i],a[j] = a[j],a[i]
同样,对于一个函数的返回,golang可以返回多个值
func test() (int,int,int) {
return 1,2,3
}
func main(){
x,y,z := test()
fmt.Printf("%d %d %d",x,y,z) // 1 2 3
}
类型
type 类型名字 数据类型
type myInt int
var a myInt = 10
fmt.Print(a) // 10
包和文件
go的包结构很像java,只允许一个main方法,需要什么包,就自动添加进来,比如说我们写个温度转换的库
- 在src下新建一个tempconv的包,新建一个tempconv.go文件,用来录入一些测试数据
package tempconv
import "fmt"
//类型声明
type Celsius float64
type Fahrenheit float64
//常量块声明
const(
AbsoluteZero Celsius = -273.15
FreezingC Celsius = 0
BoilingC Celsius = 100
)
//重写String接口方法
func (c Celsius) String() string {
return fmt.Sprintf("%g°C",c)
}
//重写String接口方法
func (f Fahrenheit) String() string{
return fmt.Sprintf("%g°F",f)
}
- 在tempconv下新建一个文件conv.go,用来进行温度单位转换
package tempconv
// CToF converts a Celsius temperature to Fahrenheit.
func CToF(c Celsius) Fahrenheit { return Fahrenheit(c*9/5 + 32) }
// FToC converts a Fahrenheit temperature to Celsius.
func FToC(f Fahrenheit) Celsius { return Celsius((f - 32) * 5 / 9) }
- 最后在src下的main包里的main.go文件里引用这个库
package main
import (
"fmt"
"golangStudy/src/tempconv"
)
func main() {
fmt.Println(tempconv.CToF(tempconv.BoilingC)) //212°F
}
作用域
- 全局作用域与内部作用域
var g = "g"
func main() {
f:="f"
fmt.Println(g) //package-lever var
fmt.Println(g) //local var
}
- 函数词法作用域
在函数中词法域可以深度嵌套,因此内部的⼀个声明可能屏蔽外部的声明。还有许多语法块是if或for等控制流语句构造的。下⾯的代码有三个不同的变量x,因为它们是定义在不同的词法域(这个例⼦只是为了演⽰作⽤域规则,但不是好的编程⻛格
func main() {
x := "hello!" //函数体词法域
for i := 0; i < len(x); i++ {
x := x[i] //for循环隐式初始化词法域
if x != '!' {
x := x + 'A' - 'a'//for循环体词法域
fmt.Printf("%c", x) // "HELLO" (one letter per iteration)
}
}
}