Need advice about which tool to choose?Ask the StackShare community!
Go vs Ktor: What are the differences?
Introduction
In this article, we will discuss the key differences between Go and Ktor. Both Go and Ktor are modern programming languages used for web development. However, they differ in several aspects that make them suitable for different use cases. Let's explore these differences in more detail below.
Syntax and Language Features: Go uses a C-like syntax that is easy to read and understand. It has a strong focus on simplicity and readability. On the other hand, Ktor is built using Kotlin, a programming language developed by JetBrains. Kotlin provides many advanced language features and expressive syntax that allow developers to write concise and expressive code.
Concurrency Model: Go is designed from the ground up to support concurrent programming. It has goroutines, which are lightweight threads of execution, and channels, which are used for communication between goroutines. This makes it easy to write concurrent and scalable applications in Go. Ktor, on the other hand, has coroutines, which are lightweight threads that can be used for asynchronous programming. Coroutines in Ktor provide a simple and efficient way to write asynchronous code.
Standard Libraries and Ecosystem: Go has a robust standard library that provides a wide range of functionalities, including networking, cryptography, and file system operations. It also has a large and active community that contributes to the Go ecosystem by developing and maintaining various libraries and frameworks. Ktor, being built on Kotlin, benefits from the rich ecosystem of Java and Kotlin libraries. It can directly leverage Java libraries and frameworks, making it easier to integrate with existing Java projects.
Performance: Go is known for its high-performance and efficiency. It compiles to machine code, which allows it to run at near-native speeds. Its simplicity and minimalistic design help in reducing memory footprint and overhead. Ktor, on the other hand, runs on the Java Virtual Machine (JVM) and benefits from the performance optimizations provided by the JVM. JVM's Just-In-Time (JIT) compilation and runtime optimizations can result in excellent performance for Ktor applications.
Deployment and Execution: Go produces statically linked executables, which means that a Go application can be easily deployed by copying the executable file to a target machine. This makes it convenient to distribute and run Go applications. Ktor, being a JVM-based framework, requires the Java Runtime Environment (JRE) to be installed on the target machine. It relies on JVM's bytecode execution, which may involve additional steps for deployment and execution.
Development Tooling: Go has a simple and straightforward toolchain that provides essential development tools like compiler, debugger, and package manager. It also has built-in support for testing and benchmarking. Ktor leverages the tooling provided by the Kotlin ecosystem, including the IntelliJ IDEA IDE, which offers advanced features like code completion, refactoring, and debugging.
In summary, Go and Ktor differ in terms of syntax, concurrency model, standard libraries and ecosystem, performance, deployment and execution, and development tooling. Developers should consider these differences while choosing between the two languages/frameworks based on their specific use cases and requirements.
I've been juggling with an app idea and am clueless about how to build it.
A little about the app:
- Social network type app ,
- Users can create different directories, in those directories post images and/or text that'll be shared on a public dashboard .
Directory creation is the main point of this app. Besides there'll be rooms(groups),chatting system, search operations similar to instagram,push notifications
I have two options:
- React Native, Python, AWS stack or
- Flutter, Go ( I don't know what stack or tools to use)
Currently, I have decided to use Python and JavaScript (especially React and Node.js) for any of my projects. Well, I have used Python with Django for a lot of things, and I would certainly recommend Django to anyone, due to its high secure authentication and authorization inbuilt system, a ready to use admin platform, template tags, and many more. Well, I guess that you would like to use Python to create the backend of your application, an API, and React Native for the frontend. Python and JavaScript (React) are on the trend these days and have a huge community, so there are many resources, tutorials, great documentation. I have not really heard anyone using Flutter and Go for applications these days, so I would not recommend it to you, it would make your life much more difficult.
Hope that helps, and good luck with your project!
I'm typically agnostic when it comes to picking languages. Whatever gets the job done, but, in this case, to figure out what's involved with what you want to do, it's going to be much more than just picking programming languages for your client and backend interfaces.
So, I'm recommending you use Flutter+Firebase as a way to figure out what you need to get done. It supports both iOS and Android out of the box, introduces you to a bunch of components you will need to think about in the future (whether you stick with Firebase or not), and the key here, is that there are tons of articles, youtube videos, and other courses you can take to pick it up pretty quickly. You could even clone an Instagram knockoff from github. Guess what else, it's all free. You might not need to worry as much about the backend since there are client libraries for Flutter/Dart for Firebase.
Some might have different opinions, and like I said, I'm usually agnostic, but in this case, you have a lot to consider. Where are you going to store the data? Are people going to need to login? Will there but customized settings the will save even if I close the app? Yeah, that's just a few questions.
Those are just a few. Lots to consider, so if you want to get something in your hand as soon as possible, try a search for flutter + firebase + chat + Instagram or something like that and have a look.
If this is for learning about how to design the system, then pick the tools are you are confortable with.
Often times, I get stuck picking the tools (and trying to learn about them) vs actually trying to design the system itself.
If you are familiar with React (check out Expo) and Django then I would recommend going with that.
For deploying your backend, I would go with a provider like https://zeit.co/ that automates a whole bunch of deployment steps with their cli tools that you might have to do with AWS.
The above listed tools will do the job, you just need to figure out your architecture(e.g models). How they will all connect. Then you can use a tool you are comfortable with to implement them.
What you need to take a look at is Apache OpenMeetings. It already does what you want, it is open source and well documented and only requires that you design the UI and plumbing required to serve you application.
Let's select right tool you feel you are good at. And selecting tools are used by large community to solve your stuck if encounter
We are converting AWS Lambdas from Java due to excessive cold start times. Usage: These lambdas handle XML and JSON payloads, they use s3, API Gateway, RDS, DynamoDB, and external API's. Most of our developers are only experienced in java. These three languages (Go, Node.js, and Python) were discussed, but no consensus has been reached yet.
I've worked with all three of these languages and also with Java developers converting to these languages and far and away Go is the easier one to convert to. With the improved cold-start times and the ease of conversion for a Java developer, it is a no-brainer for me.
The hardest part of the conversion though is going to be the lack of traditional Classes so you have to be mindful of that, but Go Structs and interfaces tend to make up for what is lost there.
Full Disclosure: I'm a 95% Go convert (from Python) at this point in time.
Although I am primarily a Javascript developer myself, I used Go to build AWS lambda in a similar scenario to yours. AWS libraries felt better integrated on the Go side, I believe due to the language itself (e.g. how JSON objects are handled in go). Besides that performance of Go is much superior. But on the cons side; community is far smaller around Go, compared to Javascript. That is easy notice if you look at repos of community-maintained libraries for Go. That can feel a bit unreliable.
Go would provide the easiest transition for Java programmers -- its IDE/tooling is second to none (just install Goland) and the deploy/distribution story is extremely clean and lends itself to work well in lambda: single, static binaries with quick startup. No need to set up a full environment or package dependencies on your lambda AMIs, just copy a file.
I was initially going to suggest JavaScript due to the smaller size needs of AWS Lambdas code and the larger range of libraries and community available (and to avoid Python for this). But I have to agree with the recommendations and rationale of @ayildirim above and I think you should choose any reasonable language that is low-overhead, fast startup, and best supported by AWS Lambda, and that is probably Go. I don't think you are likely to go wrong with that, while you can potentially with the others.
So I'd agree, on the strength of AWS Lambda support and the solid performance of Go, it seems like your best choice here for Lambdas (and I'm going to need to consider that myself going forward... pardon the pun).
If you want to prioritise language familiarity, JavaScript is more like Java than the other choices; and it can be optimised to run very fast. However if you need really fast cold-start times, you can't beat Go since it's compiled. There are other things to consider, such as the massive amount of community packages and help/documentation in the JavaScript ecosystem. Go is newer but seems to be quite popular if you need something that runs fast in a single binary.
Finding the best server-side tool for building a personal information organizer that focuses on performance, simplicity, and scalability.
performance and scalability get a prototype going fast by keeping codebase simple find hosting that is affordable and scales well (Java/Scala-based ones might not be affordable)
I've picked Node.js here but honestly it's a toss up between that and Go around this. It really depends on your background and skillset around "get something going fast" for one of these languages. Based on not knowing that I've suggested Node because it can be easier to prototype quickly and built right is performant enough. The scaffolding provided around Node.js services (Koa, Restify, NestJS) means you can get up and running pretty easily. It's important to note that the tooling surrounding this is good also, such as tracing, metrics et al (important when you're building production ready services).
You'll get more scalability and perf from go, but balancing them out I would say that you'll get pretty far with a well built Node.JS service (our entire site with over 1.5k requests/m scales easily and holds it's own with 4 pods in production.
Without knowing the scale you are building for and the systems you are using around it it's hard to say for certain this is the right route.
Telegram Messenger has frameworks for most known languages, which makes easier for anyone to integrate with them. I started with Golang and soon found that those frameworks are not up to date, not to mention my experience testing on Golang is also mixed due to how their testing tool works. The natural runner-up was JS, which I'm ditching in favor of TS to make a strongly typed code, proper tests and documentation for broader usage. TypeScript allows fast prototyping and can prevent problems during code phase, given that your IDE of choice has support for a language server, and build phase. Pairing it with lint tools also allows honing code before it even hits the repositories.
1. Type safety and inferred types
Go is type safe by default, which allows you to right more reliable code and have better developer tooling, plus with the :=
operator, you can initialize a variable without having to define its type because it automatically gets its type from the initial value.
2. Performance
There isn't much to be said here, but on most counts go beats both Python and Node.js on performance.
3. Documentation
I'm not talking about the Go language itself, although it does have good docs. I'm talking about Go's auto generated documentation tool, which allows people to document their packages easily and works amazingly with Go's type system.
4. Compiles to binary
If you are making a local program for somebody and they don't want to download the Go compiler, you can make Go into a native binary.
5. Built for the web
Go has built in Http libraries to rival Express.js and has a HTML/Text templating system.
6. Great Concurrency
Go utilizes Goroutines to help developers utilize multiple threads easily.
Conclusion
Go is an excellent choice for any system code, especially http networking and web backends.
C# and .Net were obvious choices for us at LiveTiles given our investment in the Microsoft ecosystem. It enabled us to harness of the .Net framework to build ASP.Net MVC, WebAPI, and Serverless applications very easily. Coupled with the high productivity of Visual Studio, it's the native tongue of Microsoft technology.
Node.js has been growing in popularity, and the ability to access the global pool of Javascript developers is great. There is a decreased amount of effort for people to work across the frontend and backend, and the language itself is easy and works well for many common use cases.
Go was the other serious candidate, but it just hasn't been implemented in as many Production systems yet, and the best Go engineers I've known have been hackers, whereas we're building a robust analytics platform that requires more caution. Type safety is easily added with TypeScript, and NPM is awesomely handy.
When developing a new blockchain, we as a team chose Go lang over Java and other candidates, due to Go being (a) natively suited to concurrency - there are primitives in the language itself (goroutines, channels) that really help with reasoning about concurrency (b) super fast - build time, running, testing are all much faster that Java, this gives a far superior developer experience (c) shorter and stricter than Java - code is much shorter (less verbose), and there is usually one good way to do things, and even the code formatter that is bundled with Go is very opinionated - over a short time this makes reading other people's code far smoother than having to deal with different styles.
You should be aware that Go presently (v1.13) lacks Generics.
I chose Golang as a language to write Tango because it's super easy to get started with. I also considered Rust, but learning curve of it is much higher than in Golang. I felt like I would need to spend an endless amount of time to even get the hello world app working in Rust. While easy to learn, Golang still shows good performance, multithreading out of the box and fun to implement.
I also could choose PHP and create a phar-based tool, but I was not sure that it would be a good choice as I want to scale to be able to process Gbs of access log data
We decided to use python to write our ETLs and import them into metabase via a lambda. Before python we tried using Go, but overall go was way more verbose than Python when writing the ETLs. Go also had some issues managing memory when using the S3 upload manager library. This was a deal breaker for us that made us switch to Python.
In the end the solution was much cleaner and maintainable.
This language, even in early dev stages is to put it simply, fantastic! It is small, fast, and types a lot like go. It feels complete even though coming out less than a year ago in first early stages. I love it, it works anywhere and everywhere plus making binaries and GUI applications is just super easy!
A number of years ago; I had done python for a long time prior to learning about Go. Most of what I wrote was system-like things and web-things in python, and I got tired of running into the lack-of-a-type-system problems that python gave me. I wanted to switch to a compiled, strongly-typed system that wasn't C/C++ (been there, done that, got the "shoot yourself in the foot" t-shirt). I looked into both Rust/Go, and for what I wanted to do (system/web) stuff ... at the time, Go was the strongest candidate, so I switched and never went back. Recently I started to re-look at Rust for system things, but for anything I do that I have to touch the web with, it will be Go from now on.
As a personal research project I wanted to add post-quantum crypto KEM (key encapsulation) algorithms and new symmetric crypto session algorithms to openssh. I found the openssh code and its channel/context management extremely complex.
Concurrently, I was learning Go. It occurred to me that Go's excellent standard library, including crypto libraries, plus its much safer memory model and string/buffer handling would be better suited to a secure remote shell solution. So I started from scratch, writing a clean-room Go-based solution, without regard for ssh compatibility. Interactive and token-based login, secure copy and tunnels.
Of course, it needs a proper security audit for side channel attacks, protocol vulnerabilities and so on -- but I was impressed by how much simpler a client-server application with crypto and complex terminal handling was in Go.
$ sloc openssh-portable Languages Files Code Comment Blank Total CodeLns Total 502 112982 14327 15705 143014 100.0% C 389 105938 13349 14416 133703 93.5% Shell 92 6118 937 1129 8184 5.7% Make 16 468 37 131 636 0.4% AWK 1 363 0 7 370 0.3% C++ 3 79 4 18 101 0.1% Conf 1 16 0 4 20 0.0% $ sloc xs Languages Files Code Comment Blank Total CodeLns Total 34 3658 1231 655 5544 100.0% Go 19 3230 1199 507 4936 89.0% Markdown 2 181 0 76 257 4.6% Make 7 148 4 50 202 3.6% YAML 1 39 0 5 44 0.8% Text 1 30 0 7 37 0.7% Modula 1 16 0 2 18 0.3% Shell 3 14 28 8 50 0.9%
Pros of Golang
- High-performance553
- Simple, minimal syntax397
- Fun to write364
- Easy concurrency support via goroutines303
- Fast compilation times273
- Goroutines195
- Statically linked binaries that are simple to deploy181
- Simple compile build/run procedures151
- Backed by google137
- Great community137
- Garbage collection built-in53
- Built-in Testing47
- Excellent tools - gofmt, godoc etc44
- Elegant and concise like Python, fast like C40
- Awesome to Develop37
- Used for Docker26
- Flexible interface system26
- Great concurrency pattern25
- Deploy as executable24
- Open-source Integration21
- Easy to read19
- Fun to write and so many feature out of the box17
- Go is God17
- Powerful and simple14
- Easy to deploy14
- Its Simple and Heavy duty14
- Concurrency14
- Best language for concurrency13
- Safe GOTOs11
- Rich standard library11
- Clean code, high performance10
- Easy setup10
- High performance10
- Simplicity, Concurrency, Performance9
- Cross compiling8
- Single binary avoids library dependency issues8
- Hassle free deployment8
- Used by Giants of the industry7
- Simple, powerful, and great performance7
- Gofmt7
- Garbage Collection6
- WYSIWYG5
- Very sophisticated syntax5
- Excellent tooling5
- Keep it simple and stupid4
- Widely used4
- Kubernetes written on Go4
- No generics2
- Looks not fancy, but promoting pragmatic idioms1
- Operator goto1
Pros of Ktor
- Simple & Small9
- Kotlin native8
- Light weight7
- High performance3
Sign up to add or upvote prosMake informed product decisions
Cons of Golang
- You waste time in plumbing code catching errors42
- Verbose25
- Packages and their path dependencies are braindead23
- Google's documentations aren't beginer friendly16
- Dependency management when working on multiple projects15
- Automatic garbage collection overheads10
- Uncommon syntax8
- Type system is lacking (no generics, etc)7
- Collection framework is lacking (list, set, map)5
- Best programming language3
- A failed experiment to combine c and python1
Cons of Ktor
- Not self-explanatory: relies on Kotlin "magic"2
- Relatively fresh technology - not a lot of expertise2