• [技术干货] 2020-12-18:java和go,并发控制有哪几种方式?
    2020-12-18:java和go,并发控制有哪几种方式?#福大大架构师每日一题#
  • [技术干货] 2020-12-17:java和go,如何高效的拼接字符串?
    2020-12-17:java和go,如何高效的拼接字符串?#福大大架构师每日一题#
  • [热门活动] 【云享MindTalks·第八期】#神秘的夜幕团队成员张冶青加入群聊#Python与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都行,并解释为什么。
    2020-12-12:现场写代码,把CPU打满,java和go都行,并解释为什么。#福大大架构师每日一题#
  • [热门活动] 【12.12狂欢】数仓+BI专场,不止是四折,年终大回馈,满额消费还送P40 Pro~
    不玩虚,才是真狂欢,扫描图中二维码,火力全开“购够GO”!!!------【我】------【是】------【分】------【割】------【线】---【学习福利】关注华为云GaussDB(DWS)公众号:这里会定期推送相关干货:精品博文、维护宝典、产品信息等,和您分享最新最全的PB级数仓GaussDB(DWS)黑科技~(扫描下方公众号二维码即可关注)添加华为云GaussDB(DWS)小助手微信号:进入专家交流群,实时交流学习、分享最新的DWS资源~(扫描下方小助手二维码即可进群)GaussDB(DWS)产品主页:https://www.huaweicloud.com/product/dws.html   
  • [分享交流] 发现了一个回帖送奖品的活动。go!go!go!go!go!
    https://bbs.huaweicloud.com/forum/thread-92792-1-1.html
  • [技术干货] 2020-12-07:go中,slice的底层数据结构是什么?
    2020-12-07:go中,slice的底层数据结构是什么?#福大大架构师每日一题#
  • [技术干货] 2020-12-05:go中,map的扩容流程是什么?
    2020-12-05:go中,map的扩容流程是什么?#福大大架构师每日一题#
  • [技术干货] 2020-11-28:go中,map的写流程是什么?
    2020-11-28:go中,map的写流程是什么?#福大大架构师每日一题#
  • [技术干货] 2020-11-27:go中,map的读流程是什么?
    2020-11-27:go中,map的读流程是什么?#福大大架构师每日一题#
  • [技术干货] 2020-11-26:go中,map的创建流程是什么?
    2020-11-26:go中,map的创建流程是什么?#福大大架构师每日一题#
  • [技术干货] 2020-11-25:go中,map的底层数据结构是什么?
    2020-11-25:go中,map的底层数据结构是什么?#福大大架构师每日一题#
  • [问题求助] Cloud IDE go语言排障
    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]代表什么?是否等于固定字节数?
    2020-11-23:go中,s是一个字符串,s[0]代表什么?是否等于固定字节数?#福大大架构师每日一题#
  • [技术干货] 【转载】C++调用Go方法的字符串传递问题及解决方案
     摘要: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中何时才能真的已经没有对象引用,无法找到合适的时间点进行内存释放。
总条数:166 到第
上滑加载中