• Go入门-Java学者


    2022年10月27日

    参考:8小时转职Golang工程师-刘丹冰Aceld

    Go语言超全详解(入门级)-大家好,我是好同学

    ​ 作者在学习 Golang 语言之前,有一些 Java 基础。善于用 Mac 系统和 JetBrains 软件进行学习编码

    ​ 所以在书写笔记的过程中,可能不会特别完整,比如说 := 赋值,我觉得一个Java工作者肯定都能看的懂,为了节省文章篇幅,就不会在文章中提及,还请见谅。

    在学习 Go 之前,我们先简单的看一下 Go 的家族史,Go 继承了C语言的表达式、控制流、基础数据结构、调用参数、指针等,但是Go对C语言进行了大版本的迭代,舍弃了指针预算,重新设计了部分不太合理的运算符优先级,在很多细微处进行打磨,大致理解就是,在C的基础上,“青出于蓝,更胜于蓝”

    1、HelloWorld

    第一步、创建一个 HelloWorld

    1. package main
    2. import "fmt"
    3. func main() {
    4.  fmt.Println("Hello World")
    5. }

    2、变量

    2.1、全局和非全局变量

    1. // 变量
    2. package main
    3. import "fmt"
    4. // 全局变量
    5. var a, b int
    6. var c, d int = 12
    7. var (
    8.    e int
    9.    f bool
    10. )
    11. func main() {
    12.    // 局部变量
    13.    g, h := 123"hello"
    14.    fmt.Println(a, b, c, d, e, f, g, h)
    15. }

    输出结果:

    0 0 1 2 0 false 123 hello
    

    2.2、匿名变量

    1. package main
    2. import "fmt"
    3. func GetData() (intint) {
    4.  return 1020
    5. }
    6. func main() {
    7.  a, _ := GetData()
    8.  _, b := GetData()
    9.  fmt.Println(a, b)
    10. }

    输出结果:

    10 20
    

    匿名变量的特点是一个下划线 _ ,任何值赋给这个标识符都会被抛弃,因此这些值不能在后续中使用。匿名变量不会占用内存空间,不会分配内存。匿名变量与变量之间也不会因为多次声明而无法使用。

    3、指针

    引用传递,说到这里,就可以关联到堆栈之间关系,栈中地址值引用堆中数据。这里怎么理解看大家自己了。有要具体了解的可以阅读这篇文章 JVM之堆栈

    简洁一点,指针存的不是真正数据,是记录数据的地址值。

    1. package main
    2. import "fmt"
    3. func main() {
    4.  a := 100
    5.  b := 200
    6.  fmt.Println(a, b)
    7.  fmt.Println(&a, &b)
    8.   // 传入地址值进行交换
    9.  swap(&a, &b)
    10.  fmt.Println(a, b)
    11. }
    12. func swap(x *int, y *int) {
    13.  var temp int
    14.  temp = *x
    15.  *= *y
    16.  *= temp
    17. }

    输出结果

    1. 100 200
    2. 0xc00012a008 0xc00012a010
    3. 200 100

    4、数组

    指定、不指定长度

    直接赋值和重新赋值

    截取、添加

    1. package main
    2. import "fmt"
    3. // 直接赋值 不指定长度
    4. var nullArray [10]float32
    5. var array = [...]float32{1000.02.03.47.050.0}
    6. func main() {
    7.  fmt.Println("nullArray:", nullArray)
    8.  fmt.Println("array:", array)
    9.  // 赋值
    10.  array := [...]int{1234567}
    11.  fmt.Println("赋值后 array:", array)
    12.  // 直接切片
    13.  s := array[:]
    14.  fmt.Println("s切片:", s)
    15.  // 截取 2-4
    16.  s1 := array[2:4]
    17.  fmt.Println("s1裁剪后:", s1)
    18.  s1 = append(s1100200)
    19.  fmt.Println("append后的s1:", s1)
    20.  fmt.Printf("实际长度len=%d 最大长度cap=%d 值slice=%v\n", len(s1), cap(s1), s1)
    21. }

    输出结果

    1. nullArray: [0 0 0 0 0 0 0 0 0 0]
    2. array: [1000 2 3.4 7 50]
    3. 赋值后 array: [1 2 3 4 5 6 7]
    4. s切片: [1 2 3 4 5 6 7]
    5. s1裁剪后: [3 4]
    6. append后的s1: [3 4 100 200]
    7. 实际长度len=4 最大长度cap=5 值slice=[3 4 100 200]

    5、Map

    Map 和数组类似,就是数据结构不一样

    1. package main
    2. import (
    3.  "fmt"
    4. )
    5. func main() {
    6.  //第一种声明
    7.  var test1 map[string]string
    8.  //在使用map前,需要先make,make的作用就是给map分配数据空间
    9.  test1 = make(map[string]string10)
    10.  test1["one"= "php"
    11.  test1["two"= "golang"
    12.  test1["three"= "java"
    13.  fmt.Println(test1//map[two:golang three:java one:php]
    14.  //第二种声明
    15.  test2 := make(map[string]string)
    16.  test2["one"= "php"
    17.  test2["two"= "golang"
    18.  test2["three"= "java"
    19.  fmt.Println(test2//map[one:php two:golang three:java]
    20.  //第三种声明
    21.  test3 := map[string]string{
    22.   "one":   "php",
    23.   "two":   "golang",
    24.   "three""java",
    25.  }
    26.  fmt.Println(test3//map[one:php two:golang three:java]
    27.  language := make(map[string]map[string]string)
    28.  language["php"= make(map[string]string2)
    29.  language["php"]["id"= "1"
    30.  language["php"]["desc"= "php是世界上最美的语言"
    31.  language["golang"= make(map[string]string2)
    32.  language["golang"]["id"= "2"
    33.  language["golang"]["desc"= "golang抗并发非常good"
    34.  fmt.Println(language) //map[php:map[id:1 desc:php是世界上最美的语言] golang:map[id:2 desc:golang抗并发非常good]]
    35.  //增删改查
    36.  val, key := language["php"//查找是否有php这个子元素
    37.  if key {
    38.   fmt.Printf("%v", val)
    39.  } else {
    40.   fmt.Printf("no")
    41.  }
    42.  language["php"]["id"= "3"         //修改了php子元素的id值
    43.  language["php"]["nickname"= "啪啪啪" //增加php元素里的nickname值
    44.  delete(language, "php")             //删除了php子元素
    45.  fmt.Println(language)
    46. }

    5.1、Map查找数据

    val, key := language["php"]
    

    Key 是一个 bool 值,表示是 val 是否存在,如果存在 val 则是有值的

  • 相关阅读:
    工程师应该掌握的10个超经典模拟电路
    redis的原理和源码-线程问题(单线程、BIO线程、redis6.0多IO线程)&源码解析
    互联网摸鱼日报(2022-12-05)
    JUC-Java线程
    React原理剖析之diff算法,一点也不难!!!
    NSDateFormatter格式化字符串时间上相差8个小时的问题处理
    网络安全(黑客)自学笔记
    查看apk签名
    基于Yolov8网络进行目标检测(二)-安装和自定义数据集
    01--nginx基础
  • 原文地址:https://blog.csdn.net/qq_39550368/article/details/127620080