GO 学习笔记(二)基本类型 & 参数传递

99 阅读3分钟

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语言框架