文章目录
- 命名
- 声明
- 变量
- 赋值
- 类型
- 包和文件
- 作用域
命名
Golang中的关键字有25个,关键字不能用于自定义名字,只能在特定语法结构中使用
在习惯上要优先使用驼峰命名
声明
golang提供了四种类型的声明语句:var const type func
变量
- 普通变量声明法:
var 变量名 类型 = 表达式
//声明单个变量var s string = "hello"fmt.Print(s) // hello//声明多个变量var i,j,k int = 1,2,3fmt.Println(i,j,k) // 1 2 3//类型自动推导式声明var a,b,c = true,"hh",0.01fmt.Println(a,b,c) //true hh 0.01fmt.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 intvar a myInt = 10fmt.Print(a) // 10
包和文件
go的包结构很像java,只允许一个main方法,需要什么包,就自动添加进来,比如说我们写个温度转换的库
- 在src下新建一个tempconv的包,新建一个tempconv.go文件,用来录入一些测试数据
package tempconvimport "fmt"//类型声明
type Celsius float64
type Fahrenheit float64//常量块声明
const(AbsoluteZero Celsius = -273.15FreezingC Celsius = 0BoilingC 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 mainimport ("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 varfmt.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)}}
}