0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Java转Go之初体验

Android编程精选 来源:CSDN 2023-07-03 10:22 次阅读

一、万能之Hello World 开启go的大门

直接上代码

packagemain//表明包

import"fmt"//导入包fmt控制输入输出感觉和java的System.out和Scanner有点像

funcmain(){
fmt.Println("Hello Go world。");//进入这个世界了
}

输出结果:

4b0572e6-1803-11ee-962d-dac502259ad0.png

是不是感觉还可以。

二、Go语言环境安装

4b19a0ae-1803-11ee-962d-dac502259ad0.png

我安装的是windows版的 双击安装选择目录 全程轻松随意 比想象中简单

4b968470-1803-11ee-962d-dac502259ad0.png

配置系统变量,然后就可以开始玩了

4bfe97e0-1803-11ee-962d-dac502259ad0.png

三、基础语法

行分割符:不需要像java一眼每句之后都加一个;表明结束 每一行都是单独的一句 如果非要把几行语句写在一起 就需要加分号了

注释 : //单行注释
/*
aaa
bbb
*/

标识符 标识符用来命名变量、类型等程序实体。一个标识符实际上就是一个或是多个字母(AZ和az)数字(0~9)、下划线_组成的序列,但是第一个字符必须是字母或下划线而不能是数字。

字符串连接 直接用+号即可连接 这点倒是和java挺像的 但是java里直接用加号连接的性能不是很好 不知道go语言中是否有相类似的编译流程

关键字

4c16e994-1803-11ee-962d-dac502259ad0.png

预定义标识符

4c2bde08-1803-11ee-962d-dac502259ad0.png

四、数据类型

4c455de2-1803-11ee-962d-dac502259ad0.png

首先一点,给我印象比较深的就是 对数字类型添加了很多的包装,在不同的应用范围内使用不同的数据类型 例如

int8 有符号 8 位整型 (-128 到 127)

int16 有符号 16 位整型 (-32768 到 32767)

int32 有符号 32 位整型 (-2147483648 到 2147483647)

int64 有符号 64 位整型 (-9223372036854775808 到 9223372036854775807)

这个给人感觉就是对使用着感觉 有了更高的要求 像java就是int Integer BigInteger这几种包装好的用就行了

当然这样要求的更细致 感觉编译的时候 就越容易控制 如果方方面面都这么细致的话 运行速度上就可以提高不少的

五、声明变量

var identifier type 例:var a int;

var identifier1,identifier2 type 例:var a,b string;

指定变量类型,如果没有初始化,则变量默认为零值
数值类型(包括complex64/128)为 0
布尔类型为 false
字符串为 “”(空字符串)
以下几种类型为 nil:
var a *int
var a []int
var a map[string] int
var a chan int
var a func(string) int
var a error // error 是接口

根据值自行判定变量类型 例:var d = true (这点就有点像js了)

省略 var, 注意 := 左侧如果没有声明新的变量,就产生编译错误,格式:v\_name := value 例:f := “Runoob”

多变量声明

//类型相同多个变量,非全局变量
varvname1,vname2,vname3type
vname1,vname2,vname3=v1,v2,v3

//和python很像,不需要显示声明类型,自动推断
varvname1,vname2,vname3=v1,v2,v3

//出现在:=左侧的变量不应该是已经被声明过的,否则会导致编译错误
vname1,vname2,vname3:=v1,v2,v3


//这种因式分解关键字的写法一般用于声明全局变量
var(
vname1v_type1
vname2v_type2
)

六、常量

const 定义常量关键字 目前感觉和final static 类似

定义了之后就不能改了 如果代码里面改了的话 会报 cannot assign to LENGTH 错误

4c6f1204-1803-11ee-962d-dac502259ad0.png

下来就发现一个神奇懂东西 iota

iota,特殊常量,可以认为是一个可以被编译器修改的常量。

iota 在 const关键字出现时将被重置为 0(const 内部的第一行之前),const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)。

4c8b09be-1803-11ee-962d-dac502259ad0.png

枚举自增计数器 感觉是这么个意思

运算符

4ca9cbe2-1803-11ee-962d-dac502259ad0.png
4cc3c042-1803-11ee-962d-dac502259ad0.png
4ce48d90-1803-11ee-962d-dac502259ad0.png
4d02a582-1803-11ee-962d-dac502259ad0.png

&这个就是只有两个1的时候才是1其余都是0

|这个是只有两个0的时候才是0其余都是1和与刚好相反

^这个简单粗暴两个相同的数字是0不同的时候是1

4d191dda-1803-11ee-962d-dac502259ad0.png
4d481ea0-1803-11ee-962d-dac502259ad0.png

这个<<=后面的几个都还有点惊艳到我了 厉害厉害

4d61ebbe-1803-11ee-962d-dac502259ad0.png

这两个优点没太看懂 敲个代码试一下

packagemain

import"fmt"

funcmain(){
varastring="abc"
varptr*string=&a
fmt.Printf("第1行-a变量类型为=%T
",a);
fmt.Printf("第2行-ptr变量类型为=%T
",ptr);
fmt.Println(*ptr)
fmt.Println(ptr)
}

4d907902-1803-11ee-962d-dac502259ad0.png

加*输出的是内容 不加输出的就是地址 这个指针的概念 java里是没有的

4da29d6c-1803-11ee-962d-dac502259ad0.png

七、条件语句

4dbac63a-1803-11ee-962d-dac502259ad0.png

这个select语句真的是看的我欲生欲死

以下描述了 select 语句的语法:

每个 case 都必须是一个通信

所有 channel 表达式都会被求值

所有被发送的表达式都会被求值

如果任意某个通信可以进行,它就执行,其他被忽略。

如果有多个 case 都可以运行,Select 会随机公平地选出一个执行。其他不会执行。

否则:

如果有 default 子句,则执行该语句。

如果没有 default 子句,select 将阻塞,直到某个通信可以运行;Go 不会重新对 channel 或值进行求值。

来来来 两段代码说明一下

packagemain

import(
"fmt"
)

funcfibonacci(c,quitchanint){
x,y:=1,1

for{
select{
casec<- x:
      fmt.Printf("x : %d, y : %d
", x, y)
            x, y = y, x+y
        case <-quit:
            fmt.Println("quit")
            return
        }
    }
}

func main() {
    c := make(chan int)
    quit := make(chan int)

    go func() {
        for i := 0; i < 6; i++ {
      fmt.Printf("开始搞事 i = %d
", i)
            fmt.Println(<-c)
        }
        quit <- 0
    }()

    fibonacci(c, quit)
}

输出结果为:

4dd7d680-1803-11ee-962d-dac502259ad0.png

第二段代码:

packagemain

import(
"fmt"
"time"
)

funcChann(chchanint,stopChchanbool){
forj:=0;j< 10; j++ {
        ch <- j
        time.Sleep(time.Second)
    }
    stopCh <- true
}

func main() {

    ch := make(chan int)
    c := 0
    stopCh := make(chan bool)

    go Chann(ch, stopCh)

    for {
        select {
        case c = <-ch:
            fmt.Println("Recvice", c)
            fmt.Println("channel")
        case s := <-ch:
            fmt.Println("Receivessss", s)
        case _ = <-stopCh:
            goto end
        }
    }
end:
}

输出结果为:

4df00cf0-1803-11ee-962d-dac502259ad0.png

这两个例子分别说明了下面两点

如果任意某个通信可以进行,它就执行,其他被忽略。

如果有多个 case 都可以运行,Select 会随机公平地选出一个执行。其他不会执行。

但是有个疑问 为啥第一个例子里在执行偶数次的时候 xy会交换两次 在下一次调用的时候又不会进行交换?内部是怎么实现的???真想打个断点调试一下 这个问题如果我往后会做go的话 我一定会回来的!!!!




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 交换机
    +关注

    关注

    19

    文章

    2441

    浏览量

    95700
  • JAVA语言
    +关注

    关注

    0

    文章

    138

    浏览量

    19946
  • go语言
    +关注

    关注

    1

    文章

    157

    浏览量

    8932

原文标题:Java 转 Go 之初体验 !

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STM32H5 DA初体验

    本文是接着之前文档《STM32H5 DA 之初体验(带 TrustZone)》的后续之作。
    的头像 发表于 01-17 13:39 627次阅读
    STM32H5 DA<b class='flag-5'>初体验</b>

    java后端能鸿蒙app开发吗

    java后端鸿蒙app开发好。 还是前端呢
    发表于 01-29 18:15

    嵌入式Linux系统之初体验

    嵌入式Linux系统之初体验
    发表于 08-18 09:34

    海同教你Java程序员Android开发必读经验

    海同教你Java程序员Android开发必读经验.啰哩啰嗦的说说Java和Android程序的区别:Android是主流智能手机的操作系统,Java是一种开发语言,两者没有好坏优劣之
    发表于 11-24 17:56

    【NUCLEO-F412ZG试用体验】开箱测评 = 爱之初体验

    本帖最后由 smilepeng 于 2017-3-7 22:20 编辑 【NUCLEO-F412ZG试用体验】开箱测评 = 爱之初体验我这小白可算见到你了,看到这么大的片子都好看,真是能装一大
    发表于 11-09 11:25

    鸿蒙系统-爱之初体验

    the Node.js process with a non-zero exit code.所以在烧录的时候可能是由于串口的驱动在VS里没有设置好,所以烧录不了;进步的最好方法就是想办法解决问题,同样希望各路大神不吝赐教,感激不尽,此次初体验就至此,同时希望官方能整合一款能通用的开发软件。`
    发表于 01-04 02:52

    Java技术在嵌入式系统中的应用是什么

    Java 程序语言在其产生之初,是为嵌入式设备--机顶盒设备设计的。现在Java又凭借J2MEE和Java Card Platform回到嵌入式系统开发领域。
    发表于 12-14 07:07

    请问前端鸿蒙怎么过渡,需要学习Java吗?

    前端鸿蒙怎么过渡,需要学习Java吗?
    发表于 06-08 11:30

    看看golang和java的文件储实现

    日志的储和压缩是非常关键的,它不仅可以减少硬盘空间占用,主要还可以在发生故障时根据日志定位出故障原因。go语言:用到了filepath包下的Walk方法,package mainimport
    发表于 10-19 17:17

    golang和java的文件储实现

    正文日志的储和压缩是非常关键的,它不仅可以减少硬盘空间占用,主要还可以在发生故障时根据日志定位出故障原因。下面来看看golang和java的文件储实现。go语言:用到了filepa
    发表于 10-20 17:36

    The Java Language Environment

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101.1 Beginnings of the Java Language Project. . . . . . . . . . . . . . 121.2 Design
    发表于 10-14 17:33 0次下载

    新入电子行业之串口初体验

    新入电子行业之串口初体验,感兴趣的小伙伴们可以看看。
    发表于 07-26 10:43 13次下载

    go语言枚举类型怎么用

    如 c、 java 等,都有原生支持。在 go 中,大家却找不到 enum 或者其它直接用来声明枚举类型的关键字。从熟悉其它编程语言的开发者转用 go 编程,刚开始会比较难接受这种情况。其实,如果你看到如何在
    的头像 发表于 09-02 09:43 4888次阅读

    Go/Rust挑战Java/Python地位

    编程语言方面,Java 和 Python 仍然遥遥领先,并且分别微小增长了 1.7% 和 3.4%;围绕 Go (增长 20%) 和 Rust (增长 22%) 的兴趣则大幅增加。报告称,如果这种
    的头像 发表于 03-06 10:19 505次阅读

    STM32H5 DA 之初体验(带 TrustZone)

    电子发烧友网站提供《STM32H5 DA 之初体验(带 TrustZone).pdf》资料免费下载
    发表于 02-19 14:19 0次下载
    STM32H5 DA <b class='flag-5'>之初体验</b>(带 TrustZone)