Go再学习_1.Go的静态类型与动态类型interface
初始化
mkdir godemo
cd godemo
go mod init godemo
go get github.com/gin-gonic/gin
edit main.go
go run
main.go
package main
import "fmt"
func init(){
fmt.Println("main init")
/* 数组, 一般都是传值 */
var a1 [5]int
var a2 [5]*int
var a3 = &[...]int{
1,2,3,4,5}
// [0 0 0 0 0] &[0 0 0 0 0] [<nil> <nil> <nil> <nil> <nil>] &[1 2 3 4 5]
fmt.Println(a1, &a1, a2, a3)
// 2 2
fmt.Println(a3[1], (*a3)[1])
/* 切片, 一般传递指针 */
var b1 = make([]int, 5)
var b2 = []int{
1,2, 3, 5:10}
var b3 = b2[1:4]
// [0 0 0 0 0] [1 2 0 0 0 10] [2 3 0]
fmt.Println(b1, b2, b3)
/*
在Go语言中只存在值传递(要么是该值的副本,要么是指针的副本),不存在引用传递。
之所以对于引用类型的传递可以修改原内容数据,是因为在底层默认使用该引用类型的指针进行传递,但是也是使用指针的副本,依旧是值传递。
对于Map,slice,chan虽然能直接通过对象的拷贝修改数值,但是无法修改原本的对象,不建议这样使用。
所以,如果需要修改内容,一定要使用某个类型的引用/指针,通过指针修改。
*/
}
func main() {
fmt.Println("main run")
}
Note
基础语法
- 传值或者引用
在Go语言中只存在值传递(要么是该值的副本,要么是指针的副本),不存在引用传递。
之所以对于引用类型的传递可以修改原内容数据,是因为在底层默认使用该引用类型的指针进行传递,但是也是使用指针的副本,依旧是值传递。
对于Map,slice,chan虽然能直接通过对象的拷贝修改数值,但是无法修改原本的对象,不建议这样使用。
所以,如果需要修改内容,一定要使用某个类型的引用/指针,通过指针修改。
- 强类型与动态类型
任何一个变量都有 变量类型和值类型 两种类型。
interface{}
是动态类型,可以存储任何类型,它的变量类型是interface{}
,值类型看的是被赋值的类型。var a int
是静态类型,只可以存储int,它的变量类型是int,值类型也是int.
还没有评论,来说两句吧...