?年学 go 1:变量&函数
变量&函数最近在学习golang,写下学习笔记提升记忆。 首先搬出我们最经典的第一段代码: hello worldpackage main // 0 import "fmt" // 1实现格式化的 I/O /* Print something */ // 2 func main() { // 3 fmt.Println("Hello,world; or καλημε ?ρα κo?σμε; orこんにちは 世界") // 4 } 首先我们要认识到 每个Go 程序都是由包组成,程序的运行入口是包main
编译和运行代码构建 Go 程序的最佳途径是使用 go 工具。 构建 helloworld 只需要: 1. go build helloworld.go # 结果是叫做 helloworld 的可执行文件。 2. ./helloworld # Hello,world; or καλημε ?ρα κo?σμε; or こんにちは世界 变量Go 是静态类型语言,不能在运行期改变变量类型。 变量如果不提供初始化值将自动初始化为零值。如果提供初始化值,可省略变量类型,由编译器自动推断。 var x int // 使用关键字 var 定义变量,跟函数的参数列表一样,类型在后面。 var c,python,java bool // 多个相同类型的变量可以写在一行。 var f float32 = 1.6 var i,j int = 1,2 // 变量定义可以包含初始值,每个变量对应一个。 var s = "abc" // 如果初始化是使用表达式,则可以省略类型;变量从初始值中获得类型。 变量在定义时没有明确的初始化时会赋值为零值 。 零值是:
在函数内部,可用更简略的 ":=" 式定义变量。 func main() { n,s := 12,"Hello,World!" println(s,n) } 函数外的每个语句都必须以关键字开始( var 、 func 、等等), := 结构不能使用在函数外。 可一次定义多个变量。 var x,y,z int var s,n = "abc",123 var ( a int b float32 ) func main() { n,s := 0x1234,World!" println(x,s,n) } 一个特殊的变量名是 _(下划线)。任何赋给它的值都被丢弃。在这个例子中,将 35 赋值给 b,同时丢弃 34。 _,b := 34,35 Go 的编译器会对声明却未使用的变量报错 var s string // 全局变量没问题。 func main() { i := 0 // Error: i declared and not used。(可使 "_ = i" 规避) } 定义完之后的变量可以被重新赋值 比如第8行,将计算结果赋值给result。 常量常量值必须是编译期可确定的数字、字符串、布尔值。 常量的定义与变量类似,只不过使用 const 关键字 const x,y int = 1,2 const s = "Hello,World!" // 多常量初始化 // 类型推断 // 常量组 const ( a,b = 10,100 c bool = false ) func main() _{ const x = 'xxx' // 未使用局部常量不会引发编译错误 } 在常量中,如果不提供类型和初始化值,那么被看作和上一常量相同 const ( s = "abc" x // x = "abc" ) 变量值的引用通常情况下 go 语言的 值在传递给函数或者方法的时候会被复制一次 不同类型参数所占空间如下:
x := 3 y := 22 // 变量 x,y 为int型 分别赋值 3 22 内存地址 0xf840000148 0xf840000150 x == 3 && y == 22 pi := &x // 变量pi 为 *int(指向int型变量的指针) 在这里我们将变量x的内存地址赋值给pi,即pi 保存了另一个变量的内存地址(这也是指针定义) pi == 3 && x == 3 && y == 22 x++ // x + 1 此时 x==4 pi 指向x的内存地址 所以 pi == 4 && x == 4 && y == 22 *pi++ // *pi ++ 意为着pi指向的值增加 *pi == 5 & x == 5 && y == 22 pi := &y //pi 指向y的内存地址 *pi == 22 && x == 5 && y == 22 *pi++ // *pi++ 意为着pi指向的值增加 *pi == 23 && x == 5 && y == 23 基本类型Go 有明确的数字类型命名,支持 Unicode,支持常用数据结构
类型转换go 使用表达式 T(v) 将值 v 转换为类型 T 。 var b byte = 100 // var n int = b // Error: cannot use b (type byte) as type int in assignment var n int = int(b) // 显式转换 不能将其他类型当 bool 值使用 a := 100 if a { // Error: non-bool a (type int) used as if condition println("true") } 函数首先看下面这段代码 package main import "fmt" func add(x int,y int) int { return x + y } func main() { fmt.Println(add(42,13)) } 函数定义使用关键字 func 定义函数,左大括号不能另起一行 golang中符合规范的函数一般写成如下的形式: func functionName(parameter_list) (return_value_list) { … } // parameter_list 是参数列表 // return_value_list 是返回值列表 下边有详细的讲解 函数的特性
func test(x int,y int,s string) (r int,s string) { // 类型相同的相邻参数可合并 n := x + y // 多返回值必须用括号。 return n,fmt.Sprintf(s,n) } 关键字 在这个例子中: x int,y int 被缩写为 x,y int
func test(s string,n ...int) string { var x int for _,i := range n { x += i } return fmt.Sprintf(s,x) } // 使用slice 做变参时,必须展开 func main() { s := []int{1,2,3} println(test("sum: %d",s...)) } 函数是第一类对象,可作为参数传递 就像其他在 Go 中的其他东西一样,函数也是值而已。它们可以像下面这样赋值给变量: func main() { a := func() { // 定义一个匿名函数,并且赋值给 a println("Hello") } // 这里没有 () a() // 调用函数 } 如果使用 fmt.Printf("%Tn",a) 打印 a 的类型,输出结果是 func() 返回值函数可以返回任意数量返回值 Go 函数的返回值或者结果参数可以指定一个名字,并且像原始的变量那样使用,就像 输入参数那样。如果对其命名,在函数开始时,它们会用其类型的零值初始化 package main import "fmt" func swap(x,y string) (string,string) { return y,x } func main() { a,b := swap("hello","world") fmt.Println(a,b) } /* 函数可以返回任意数量返回值 swap 函数返回了两个字符串 */ Go 的返回值可以被命名,并且就像在函数体开头声明的变量那样使用。 package main import "fmt" func split(sum int) (x,y int) { // 初始化返回值为 x,y x = sum * 4 / 9 // x,y 已经初始化,可以直接赋值使用 y = sum - x return // 隐式返回x,y(裸返回) } func main() { fmt.Println(split(17)) } /* 在长的函数中这样的裸返回会影响代码的可读性。 */ 有返回值的函数,必须有明确的return 语句,否则会引发编译错误 名词解释函数原型
下节预告变量和函数部分暂时这些,有更新还会补充。下一篇将会是控制流。 package main import "fmt" func main() { result := 0 for i := 0; i <= 10; i++ { result = fibonacci(i) fmt.Printf("fibonacci(%d) is: %dn",i,result) } } func fibonacci(n int) (res int) { if n <= 1 { res = 1 } else { res = fibonacci(n-1) + fibonacci(n-2) } return } 参考链接
最后,感谢女朋友支持和包容,比?? 想了解以下内容可以在公号输入相应关键字获取历史文章:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |