-
2020-12-18:java和go,并发控制有哪几种方式?#福大大架构师每日一题#
-
2020-12-17:java和go,如何高效的拼接字符串?#福大大架构师每日一题#
-
那晚你错过的交流(PPT文末自取)那一晚,你没来第八期云享MindTalks,可能错过了一场精彩的对话交流~餐前小甜点助手小采访:你为什么选择用Python?因为语法简单?优雅?还是因为免费?:不,因为惜命,“人生苦短,我用Python”。暖心小贴士:Python的编写效率高,可以用Python省下的时间去植发哦。助手小采访:用Python你幸福吗?:我姓张。助手小采访:……,那可以请您简单分享一下Python的使用体验吗?:动态一时爽,一直动态一直爽。助手小采访:那是不是意味着这个工具很好用,妈妈再也不用担心我出bug的感觉?:什么BUG?!!暖心小贴士:动态一时爽,重构火葬场,这是动态语言的弊端。助手小采访:听说您之后又去学了Go?请用一句话证明。:err !=nil精彩正餐吃到饱交流者1号:Go的gorotine和Python的corotine区别?张老师:gorotine应该就是Go语言的协程,corotine是Python语言的协程,corontine是借鉴了JavaScript里的语法。协程你可以想象为轻量型的线程。交流者2号:我现在想修全栈向,Python用了三年,不会别的语言。一直在开脚本和API,想做点带前端的完整作品。未来趋势来看,是修炼react+go还是继续Python撸flask+django?张老师:谈点个人看法啊,Python用了三年说明你已经很熟悉Python了。从我自己的经历来说,我也是先学了Python然后又学习了Go,我觉得我们学点其他的知识,有助于拓宽我们的知识面,能够帮助到自己打开视野。react是Javascript的一个分支,一个框架,如果你想要修全栈的话,是可以学习一下的。现在react,vue比较主流,flask的话,目前不是那么的主流。交流者3号:Python使用uvloop的话,速度比Go如何?张老师:这个问题我没有实践过uvloop,无法给你做准确的判断,如果你用Python做一些底层的设计的话,能够对它进行一些优化,很可能会取得很好的效果。交流者4号:前端是vue还是react?如果时间有限的话。张老师:国内的话vue还是很多的,国外多是react,如果时间有限的话,建议学习vue,可以从3开始学;如果时间允许的话,建议两个都可以学着看看。交流者5号:Python转数据挖掘可以吗?不知道从何下手。张老师:如果你是用Python做数据分析,是完全可以转数据挖掘的。数据挖掘的话,还包含数据分析和机器学习的,Python的话,比较好的一点,就是有很多库都给你封装好了。如果说你能理解基础原理的话,完全是可以转的。交流者6号:Go和dart差不多吗?张老师:我知道移动端一个比较火的框架就是用dart语言写的,dart的话更多的可能会用于移动开发,相对来说Go的话使用的范围更广。交流者7号:老师是怎么学习Go的?张老师:总结下来的话,就是实践,“实践出真理”,我觉得我个人比较有效的学习方式就是通过实践,因为有Python的基础,经常做Python和go的对比,加强自己的理解,也更有意思。learn by doing是非常有效的学习方式。交流者8号:老师您的CrawLab从Python到Go重构了多久?张老师:重构了大概二十天左右,最近在着手做大的架构升级,预计明年初可以发版~Github: https://github.com/crawlab-team/crawlabDemo: https://demo-pro.crawlab.cn文档: https://docs.crawlab.cn欢迎大家来给我+star哦~谢谢交流者9号:请问有什么推荐的项目吗?张老师:推荐可以从小项目入手,比如: PPT: https://tinyurl.com/yd7gdf4k- 视频: https://www.bilibili.com/video/BV1Az4y1r7gE/- Go入门开源项目: 1. https://github.com/linxGnu/goseaweedfs 2. https://github.com/spf13/viper 3. https://github.com/crawlab-team/crawlab-go-sdk 4. https://github.com/jaeles-project/gospider学习资料推荐Python 基础 •https://github.com/jackfrued/Python-Core-50-Courses (中文) •https://github.com/learnbyexample/Python_Basics (英文) 进阶 《Python高性能编程》 - Micha Gorelick & Ian Ozsvald 《Python核心编程》 - Wesley Chun 《利用Python进行数据分析》 - Wes McKinney 《Python自然语言处理》 - Steven Bird, Ewan Klein & Edward Loper 《Python 3网络爬虫开发实战》 - 崔庆才 《Python 3网络爬虫宝典》 - 韦世东 极客时间《Python核心技术与实战》 -景霄Go 基础 掘金小册《基于 Go 语言构建企业级的 RESTful API 服务》 - 雷克斯 《Go语言核心编程》 - 李文塔 进阶 《Go语言实战》 - William Kennedy, Brian Ketelsen & Erik St. Martin 《Go语言高级编程》 - 柴树杉 &曹春晖更多精彩,敬请期待~扫码进微信群,仅限200人开始时间12月17日 20:00活动介绍云享MindTalks是由华为云DevCloud团队携手云享专家共同策划进行的系列技术交流活动。各业界大咖纷纷现身群聊,以即时对话形式,来进行最直接的技术交流和思想碰撞。不同领域的专家,各样的业界话题尽在此处,为保证极简极高效,活动仅20分钟,限量200人,先进先得。编程语言那么多那个才是你的心头好?是优雅简单的Python?还是高效精致的Go?动态与静态语言的选型之争,由张冶青老师带你全面分析! 专家介绍知名外企前端开发工程师神秘Night Team(夜幕团队)成员8年软件开发经验,全干工程师专注前端、爬虫和数据分析领域活动规则1.扫码加小助手入群聊,仅限200人,先到先得。2.对未能及时回复的问题,由助手收集集中回答。3.更多资源和活动请进入云享MindTalks VIP群。4.抽奖奖品为限定HE2E知识卡牌和老师推荐书籍 《Go语言核心编程》。
-
2020-12-12:现场写代码,把CPU打满,java和go都行,并解释为什么。#福大大架构师每日一题#
-
不玩虚,才是真狂欢,扫描图中二维码,火力全开“购够GO”!!!------【我】------【是】------【分】------【割】------【线】---【学习福利】关注华为云GaussDB(DWS)公众号:这里会定期推送相关干货:精品博文、维护宝典、产品信息等,和您分享最新最全的PB级数仓GaussDB(DWS)黑科技~(扫描下方公众号二维码即可关注)添加华为云GaussDB(DWS)小助手微信号:进入专家交流群,实时交流学习、分享最新的DWS资源~(扫描下方小助手二维码即可进群)GaussDB(DWS)产品主页:https://www.huaweicloud.com/product/dws.html
-
https://bbs.huaweicloud.com/forum/thread-92792-1-1.html
-
2020-12-07:go中,slice的底层数据结构是什么?#福大大架构师每日一题#
-
2020-12-05:go中,map的扩容流程是什么?#福大大架构师每日一题#
-
2020-11-28:go中,map的写流程是什么?#福大大架构师每日一题#
-
2020-11-27:go中,map的读流程是什么?#福大大架构师每日一题#
-
2020-11-26:go中,map的创建流程是什么?#福大大架构师每日一题#
-
2020-11-25:go中,map的底层数据结构是什么?#福大大架构师每日一题#
-
GO语言一张白纸,从CloudIDE开始,也算是云原生了吧。学习一门语言,最好的方法直接是上代码,搜了下没找到最佳实践,就从csdn上找到些例子:package main import "fmt" func main() { var line int = 10 //行数 for i := 0; i < line-1; i++ { for j := 0; j < line-i-1; j++ { fmt.Print(" ") } for k := 0; k < i*2+1; k++ { fmt.Print("*") } fmt.Println() }}跑了下,问题就来了。。。。显示不对呀,但是哪里有问题呢?改个line=9那就是10不对么?第三遍运行:这。。。哪里有问题了呢?
-
2020-11-23:go中,s是一个字符串,s[0]代表什么?是否等于固定字节数?#福大大架构师每日一题#
-
摘要:C++调用Go方法时,字符串参数的内存管理需要由Go侧进行深度值拷贝。现象在一个APP技术项目中,子进程按请求加载Go的ServiceModule,将需要拉起的ServiceModule信息传递给Go的Loader,存在C++调用Go方法,传递字符串的场景。方案验证时,发现有奇怪的将std::string对象的内容传递给Go方法后,在Go方法协程中取到的值与预期不一致。经过一段时间的分析和验证,终于理解问题产生的原因并给出解决方案,现分享如下。背景知识Go有自己的内存回收GC机制,通过make等申请的内存不需要手动释放。C++中为std::string变量赋值新字符串后,.c_str()和.size()的结果会联动变化,尤其是.c_str()指向的地址也有可能变化。go build -buildmode=c-shared .生成的.h头文件中定义了C++中Go的变量类型的定义映射关系,比如GoString、GoInt等。其中GoString实际是一个结构体,包含一个字符指针和一个字符长度。原理及解释通过代码示例方式解释具体现象及原因,详见注释C++侧代码://// Created by w00526151 on 2020/11/5.// #include <string>#include <iostream>#include <unistd.h>#include "libgoloader.h" /*** 构造GoString结构体对象* @param p* @param n* @return*/GoString buildGoString(const char* p, size_t n){ //typedef struct { const char *p; ptrdiff_t n; } _GoString_; //typedef _GoString_ GoString; return {p, static_cast<ptrdiff_t>(n)};} int main(){ std::cout<<"test send string to go in C++"<<std::endl; std::string tmpStr = "/tmp/udsgateway-netconftemplateservice"; printf("in C++ tmpStr: %p, tmpStr: %s, tmpStr.size:%lu \r\n", tmpStr.c_str(), tmpStr.c_str(), tmpStr.size()); { //通过new新申请一段内存做字符串拷贝 char *newStrPtr = NULL; int newStrSize = tmpStr.size(); newStrPtr = new char[newStrSize]; tmpStr.copy(newStrPtr, newStrSize, 0); //调用Go方法,第一个参数直接传std::string的c_str指针和大小,第二个参数传在C++中单独申请的内存并拷贝的字符串指针,第三个参数和第一个一样,但是在go代码中做内存拷贝保存。 //调用Go方法后,通过赋值修改std::string的值内容,等待Go中新起的线程10s后再将三个参数值打印出来。 LoadModule(buildGoString(tmpStr.c_str(), tmpStr.size()), buildGoString(newStrPtr, newStrSize), buildGoString(tmpStr.c_str(),tmpStr.size())); //修改tmpStr的值,tmpStr.c_str()得到的指针指向内容会变化,tmpStr.size()的值也会变化,Go中第一个参数也会受到影响,前几位会变成新字符串内容。 //由于在Go中int是值拷贝,所以在Go中,第一个参数的长度没有变化,因此实际在Go中已经出现内存越界访问,可能产生Coredump。 tmpStr = "new string"; printf("in C++ change tmpStr and delete newStrPtr, new tmpStr: %p, tmpStr: %s, tmpStr.size:%lu \r\n", tmpStr.c_str(), tmpStr.c_str(), tmpStr.size()); //释放新申请的newStrPtr指针,Go中对应第二个string变量内存也会受到影响,产生乱码。 // 实际在Go中,已经在访问一段在C++中已经释放的内存,属于野指针访问,可能产生Coredump。 delete newStrPtr; } pause();}Go侧代码: package main import "C" import ( "fmt" "time" ) func printInGo(p0 string, p1 string, p2 string){ time.Sleep(10 * time.Second) fmt.Printf("in go function, p0:%s size %d, p1:%s size %d, p2:%s size %d", p0, len(p0), p1, len(p1), p2, len(p2)) } //export LoadModule func LoadModule(name string, version string, location string) int { //通过make的方式,新构建一段内存来存放从C++处传入的字符串,深度拷贝防止C++中修改影响Go tmp3rdParam := make([]byte, len(location)) copy(tmp3rdParam, location) new3rdParam := string(tmp3rdParam) fmt.Println("in go loadModule,first param is",name,"second param is",version, "third param is", new3rdParam) go printInGo(name, version, new3rdParam); return 0 } Go侧代码通过-buildmode=c-shared的方式生成libgoloader.so及libgoloader.h供C++编译运行使用 go build -o libgoloader.so -buildmode=c-shared . 程序执行结果: test send string to go in C++ in C++ tmpStr: 0x7fffe1fb93f0, tmpStr: /tmp/udsgateway-netconftemplateservice, tmpStr.size:38 # 将C++的指针传给Go,一开始打印都是OK的 in go loadModule,first param is /tmp/udsgateway-netconftemplateservice second param is /tmp/udsgateway-netconftemplateservice third param is /tmp/udsgateway-netconftemplateservice # 在C++中,将指针指向的内容修改,或者删掉指针 in C++ change tmpStr and delete newStrPtr, new tmpStr: 0x7fffe1fb93f0, tmpStr: new string, tmpStr.size:10 # 在Go中,参数1、参数2对应的Go string变量都受到了影响,参数3由于做了深度拷贝,没有受到影响。 in go function, p0:new string eway-netconftemplateservice size 38, p1: p netconftemplateservice size 38, p2:/tmp/udsgateway-netconftemplateservice size 38 结论 结论:C++调用Go方法时,字符串参数的内存管理需要由Go侧进行深度值拷贝。即参数三的处理方式 原因:传入的字符串GoString,实际是一个结构体,第一个成员p是一个char*指针,第二个成员n是一个int长度。 在C++代码中,任何对成员p的char*指针的操作,都将直接影响到Go中的string对象的值。 只有通过单独的内存空间开辟,进行独立内存管理,才可以避免C++中的指针操作对Go的影响。 ps:不在C++中进行内存申请释放的原因是C++无法感知Go中何时才能真的已经没有对象引用,无法找到合适的时间点进行内存释放。
上滑加载中
推荐直播
-
华为云IoT开源专家实践分享:开源让物联网平台更开放、易用
2024/05/22 周三 16:30-18:00
张俭 华为云IoT DTSE技术布道师
开源,意味着开放、共享、互助、共赢。作为万物上云及各行业数字化的物联网底座,华为云IoT积极拥抱开源,借助行业开源的最佳实践,构建可靠、易用的物联网平台,并通过开放南北向SDK,助力开发者快速构建物联网应用。本期直播,华为云IoT开源专家、物联网平台资深“程序猿”张俭,带你了解华为云IoT的开源生态,并手把手教你玩转开源社区!
去报名 -
华为云开发者日·广州站
2024/05/23 周四 14:30-17:30
华为云专家团
华为云开发者日HDC.Cloud Day是面向全球开发者的旗舰活动,汇聚来自千行百业、高校及科研院所的开发人员。致力于打造开发者专属的技术盛宴,全方位服务与赋能开发者围绕华为云生态“知、学、用、创、商”的成长路径。通过前沿的技术分享、场景化的动手体验、优秀的应用创新推介,为开发者提供沉浸式学习与交流平台。开放创新,与开发者共创、共享、共赢未来。
去报名
热门标签