V (programming language): Difference between revisions

Content deleted Content added
m Spaces removed in struct examples to be consistent with documentation, books on subject, and to prevent confusion
(1) This was tried before (by Jvoisin) and removed by administrator (Dbeef) (2) Original research from non SME, blogs, or primary sources are unacceptable; check out WP:RS (3) Subtle Vandalism; WP:Sneaky
 
(11 intermediate revisions by 5 users not shown)
Line 28:
The new language was created as a result of frustration with existing languages being used for personal projects.{{sfn|Chakraborty|Haldar|2023}} It was originally intended for personal use, but after being mentioned publicly and increasing interest, it was decided to make it public. V was initially created to develop a desktop messaging client named Volt.<ref name="hackaday"/> On public release, the compiler was written in V, and could [[Self-hosting (compilers)|compile itself]].{{Sfn|Rao|2021}}{{sfn|Chakraborty|Haldar|2023}} Key design goals in creating V were being easy to learn and use, higher readability, fast compiling, increased safety, efficient development, [[Cross-platform software|cross-platform]] usability, improved [[C (programming language)|C]] [[interoperability]], better [[Error detection and correction|error handling]], modern features, and more maintainable software.<ref name="MUO"/><ref name="analyticsindiamag"/><ref name="nasufi"/><ref>{{cite web |title=V language: simple like Go, small binary like Rust|url=https://techracho.bpsinc.jp/hachi8833/2021_03_09/89457/ |website=TechRacho |access-date=3 March 2021}}</ref>
 
V is released and developed through [[GitHub]],<ref>{{cite web |url=https://ossinsight.io/analyze/vlang/v#overview |title=GitHub Programming Languages (repository details) |via=[[Open-source software|OSS]] Insight using [[TiDB]] }}{{Dead link|date=July 2025 |bot=InternetArchiveBot |fix-attempted=yes }}</ref><ref name="hackaday"/> and maintained by developers and contributors internationally.{{Sfn|Rao|2021}} It is among the languages that have been listed on the [[TIOBE index]].<ref>{{cite web |title=TIOBE Index |url=https://www.tiobe.com/tiobe-index |publisher=[[TIOBE index|TIOBE]]|website=tiobe |archive-url=https://web.archive.org/web/20250411043213/https://www.tiobe.com/tiobe-index/|archive-date=11 April 2025|access-date=11 April 2025}}</ref>
 
[[File:Veasel.svg|thumb|Veasel is the official mascot of the V programming language<ref>{{cite web |url=https://github.com/vlang/v-mascot/ |title=V's official mascot |website=GitHub |access-date=8 November 2023}}</ref>]]
Line 56:
== Syntax ==
=== Hello world ===
The [["Hello, World!" program]] in V:<ref name="MUO"/><ref name=":0">{{Cite web |title=V Documentation |url=https://docs.vlang.io/ |access-date=2025-08-25 |website=docs.vlang.io}} {{Free-content attribution|title = V Documentation| license statement URL =https://github.com/vlang/v?tab=MIT-1-ov-file| license=The MIT License|this = yes}}</ref>
The [["Hello, World!" program]] in V:<ref name="MUO"/>
<syntaxhighlight lang="v">
fn main() {
Line 64:
 
=== Variables ===
Variables are immutable by default and are defined using {{code|1=:=}} and a value. Use the {{code|mut}} [[reserved word]] (keyword) to make them mutable. Mutable variables can be assigned to using {{code|1==}}:{{sfn|Rao|2021|pp=28-40}}<ref name=":0" />
 
<syntaxhighlight lang="V">
Line 72:
</syntaxhighlight>
 
Redeclaring a variable, whether in an inner scope or in the same scope, is not allowed:{{sfn|Rao|2021|pp=28-40}}<ref name=":0" />
 
<syntaxhighlight lang="V">
Line 83:
 
=== Structs ===
Struct example:<ref name="Knott"/><ref name="section"/><ref name=":0" />
<syntaxhighlight lang="v">
struct FoobarFoo {
number int
name string
Line 92:
 
// Struct fields can be initialized by name
var1 := FoobarFoo {
number: 21
name: "baz"
Line 99:
 
// or by position
var2 := FoobarFoo{50, "quxtaz", 3.14}
</syntaxhighlight>
 
=== Heap structs ===
 
StructsBy thatdefault, structs are allocated on the [[Stack_memory|stack]]. When structs are referenced by using the prefix {{code|1=&}} or have the {{code|1=[heap]}} attribute, willthey beare allocated toon the [[Heap-based_memory_allocation|heap]] instead of the stack:{{sfn|Rao|2021}}<ref name=":0" />
<syntaxhighlight lang="v">
struct Foo {
Line 111:
 
@[heap]
struct BarBaz {
number f32
}
Line 118:
var1 := &Foo{2}
 
// BarBaz is always heap allocated because of its [heap] attribute
var2 := BarBaz{4.5}
 
</syntaxhighlight>
 
=== Methods ===
[[Method (computer programming)|Methods]] in V are functions defined with a receiver [[Parameter (computer programming)|argument]]. The receiver appears in its own argument list between the {{code|1=fn}} keyword and the method name. Methods must be in the same [[Modular programming|module]] as the receiver type.
 
The is_registeredenrolled_status method (below) has a receiver of type User{{code|1=Client}} named u{{code|1=x}}. The convention is not to use receiver names like self or this, but preferably a short name. For example:<ref name="Knott"/><ref name="nasufi"/><ref name=":0" /><syntaxhighlight lang="v">
struct UserClient {
 
enrolled bool
{{Copyvio|timestamp=20250715164557 |url=https://docs.vlang.io/structs.html#methods}}
<syntaxhighlight lang="V">
struct User {
age int
}
 
fn (ux UserClient) is_registeredenrolled_status() bool {
return x.enrolled
return u.age > 16
}
 
println(Client{enrolled: true}.enrolled_status()) // true
user := User{
println(Client{enrolled: false}.enrolled_status()) // false
age: 10
}
println(user.is_registered()) // "false"
 
user2 := User{
age: 20
}
println(user2.is_registered()) // "true"
</syntaxhighlight>
</div>
 
=== Error handling ===
Result types may represent an error returned from a function. Result types are declared by prepending {{code|!}}: {{code|!Type}}
{{Copyvio|timestamp=20250715164557 |url=https://docs.vlang.io/type-declarations.html#optionresult-types-and-error-handling}}
Optional types are for types which may represent none. Result types may represent an error returned from a function.
 
OptionOptional types are declared bymay prependingrepresent {{code|?none}}. toOption thetypes type name:prepend {{code|?Type}}. Resultto typesthe usetype {{code|!}}name: {{code|!?Type}}.<ref name="Knott"/><ref name="section"/>{{Sfn|Tsoukalos|2022}}<ref name=":0" />
<syntaxhighlight lang="V">
fn something(t string) !string {
if t == "foo" { return "foo" }
return error("invalid string")
}
 
x := something("foo") or { "default" } // x will be "foo"
y := something("carbaz") or { "default" } // y will be "default"
z := something("carbaz") or { panic("{err}") } // z will exit with an error "invalid string" and a traceback
 
println(x)
Line 169 ⟶ 158:
 
</syntaxhighlight>
</div>
 
==See also==