Go再学习_1.Go的静态类型与动态类型interface

朱雀 2023-03-04 06:46 226阅读 0赞

初始化

  1. mkdir godemo
  2. cd godemo
  3. go mod init godemo
  4. go get github.com/gin-gonic/gin
  5. edit main.go
  6. go run

main.go

  1. package main
  2. import "fmt"
  3. func init(){
  4. fmt.Println("main init")
  5. /* 数组, 一般都是传值 */
  6. var a1 [5]int
  7. var a2 [5]*int
  8. var a3 = &[...]int{
  9. 1,2,3,4,5}
  10. // [0 0 0 0 0] &[0 0 0 0 0] [<nil> <nil> <nil> <nil> <nil>] &[1 2 3 4 5]
  11. fmt.Println(a1, &a1, a2, a3)
  12. // 2 2
  13. fmt.Println(a3[1], (*a3)[1])
  14. /* 切片, 一般传递指针 */
  15. var b1 = make([]int, 5)
  16. var b2 = []int{
  17. 1,2, 3, 5:10}
  18. var b3 = b2[1:4]
  19. // [0 0 0 0 0] [1 2 0 0 0 10] [2 3 0]
  20. fmt.Println(b1, b2, b3)
  21. /*
  22. 在Go语言中只存在值传递(要么是该值的副本,要么是指针的副本),不存在引用传递。
  23. 之所以对于引用类型的传递可以修改原内容数据,是因为在底层默认使用该引用类型的指针进行传递,但是也是使用指针的副本,依旧是值传递。
  24. 对于Map,slice,chan虽然能直接通过对象的拷贝修改数值,但是无法修改原本的对象,不建议这样使用。
  25. 所以,如果需要修改内容,一定要使用某个类型的引用/指针,通过指针修改。
  26. */
  27. }
  28. func main() {
  29. fmt.Println("main run")
  30. }

Note

基础语法

  • 传值或者引用

在Go语言中只存在值传递(要么是该值的副本,要么是指针的副本),不存在引用传递。
之所以对于引用类型的传递可以修改原内容数据,是因为在底层默认使用该引用类型的指针进行传递,但是也是使用指针的副本,依旧是值传递。
对于Map,slice,chan虽然能直接通过对象的拷贝修改数值,但是无法修改原本的对象,不建议这样使用。
所以,如果需要修改内容,一定要使用某个类型的引用/指针,通过指针修改。

  • 强类型与动态类型

任何一个变量都有 变量类型和值类型 两种类型。
interface{}是动态类型,可以存储任何类型,它的变量类型是interface{},值类型看的是被赋值的类型。
var a int 是静态类型,只可以存储int,它的变量类型是int,值类型也是int.

发表评论

表情:
评论列表 (有 0 条评论,226人围观)

还没有评论,来说两句吧...

相关阅读