03 基本类型
标准变量初始化格式
var name string = "codeniu"
var gae int // 变量没有赋初始值时,会为其设置一个默认值,这个值叫做零值,int 类型的零值为 0
var isMarried bool // 零值为 false
var damageRate float32 = 0.17 // float 类型
类型推导
var hp = 1000 // hp 的类型被编译器推导为 int
短变量声明并初始化
hp := 1000
// 相当于
var hp int = 1000
Attention
短变量声明时,变量名必须是唯一的,但是在多个短变量声明和赋值中,至少有一个新声明的变量出现在左值中,看下面例子
var hp int = 1000
hp:=1001
// 报错 no new variables on left side of :=
多个短变量的声明,例子如下:
conn, err := net.Dial("tcp","127.0.0.1:8080")
// 标准格式
var conn net.Conn
var err error
conn, err = net.Dial("tcp", "127.0.0.1:8080")
net.Dial 提供按指定协议和地址发起网络连接,这个函数有两个返回值,一个是连接对象(conn),一个是错误对象(err)
在多个短变量声明和赋值中,至少有一个新声明的变量出现在左值中,这样是不会报错的
conn, err := net.Dial("tcp", "127.0.0.1:8080")
conn2, err := net.Dial("tcp", "127.0.0.1:8080")
值得注意的是不能在全局作用域中声明短变量,只能在块级作用域,表达式中声明短变量。比如如下代码,将会抛出错误:syntax error:
package main
import "fmt"
test1 := 1
func main(){
fmt.Println(test1)
}
// non-declaration statement outside function body
04 函数的参数传递
在 Javascript 中参数的传递也分为两种,一种是可以传入参数的值,比如引用类型,另外一种则不能改变,如基本类型。这两种参数的传递分别叫做指针传递和值传递。那么在go中是不是也是这样呢?
- 值传递:函数内部修改传入参数的值是函数外部传入值得一个拷贝,所以你在函数内部对这个值进行修改也不会影响外部该参数的值。
例子:
package main
import "fmt"
func add(num int){
num = 10
}
func main(){
num := 20
fmt.Println(num) // 20
add(num)
fmt.Println(num) // 20
}
使用 fmt.Println(&num) 分别查看 num 在 add 函数中,与main函数的内存地址,发现他们是不同的。
- 指针传递
上面的例子可以证明如果内存地址不同自然就是值传递,那内存地址相同就是引用传递。
func getAge(p map[string]int){
fmt.Printf("内存地址是:%p\n",&p)
p["codeniu"] = 18
}
func main(){
person := make(map[string]int) // 定义一个map类型
person["codeniu"] = 12
getAge(person)
mt.Printf(person) // 18
}
Map类型可以通过函数修改内容,但是他没有明显的指针。实际上,Go语言其实并没有引用传递, makemap方法的返回值是一个指针类型。基本类型的传递的话不能修改值,但是像map,指针类型等参数传递时是可以在函数中修改参数的值的,总的来说还是要看传递的类型是什么,是指针类型就可以修改值。
本文正在参加技术专题18期-聊聊Go语言框架